@akms/mcp-ssh 0.1.4 → 0.1.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 +282 -282
- package/lib/cli.cjs +41 -14
- package/lib/cli.cjs.map +1 -1
- package/lib/cli.js +41 -14
- package/lib/cli.js.map +1 -1
- package/lib/index.cjs +13 -2
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +13 -2
- package/lib/index.js.map +1 -1
- package/package.json +69 -69
package/lib/cli.cjs
CHANGED
|
@@ -31,11 +31,12 @@ var DEFAULT_MAX_READ_FILE_BYTES = 2e5;
|
|
|
31
31
|
var KEEPALIVE_INTERVAL_MS = 15e3;
|
|
32
32
|
var SESSION_IDLE_TIMEOUT_MS = 15 * 60 * 1e3;
|
|
33
33
|
var SESSION_SWEEP_INTERVAL_MS = 6e4;
|
|
34
|
+
var SHUTDOWN_DEADLINE_MS = 5e3;
|
|
34
35
|
var CWD_MARKER = "__AKMS_SSH_CWD__";
|
|
35
36
|
var MAX_DIRECTORY_ENTRIES = 1e3;
|
|
36
37
|
var SERVER_NAME = "akms-mcp-ssh";
|
|
37
38
|
var PACKAGE_NAME = "@akms/mcp-ssh";
|
|
38
|
-
var SERVER_VERSION = "0.1.
|
|
39
|
+
var SERVER_VERSION = "0.1.6";
|
|
39
40
|
|
|
40
41
|
// src/_defs/command-rules.ts
|
|
41
42
|
var CRITICAL_PATH_PATTERN = new RegExp(
|
|
@@ -498,6 +499,10 @@ var LEVEL_WEIGHTS = {
|
|
|
498
499
|
error: 4
|
|
499
500
|
};
|
|
500
501
|
var SECRET_META_KEYS = ["password", "passphrase", "privatekey", "privatekeypath", "secret", "token"];
|
|
502
|
+
var stderrBroken = false;
|
|
503
|
+
process.stderr.on("error", () => {
|
|
504
|
+
stderrBroken = true;
|
|
505
|
+
});
|
|
501
506
|
function resolveThreshold() {
|
|
502
507
|
const configured = process.env[LOG_LEVEL_ENV];
|
|
503
508
|
if (configured == null) {
|
|
@@ -521,6 +526,9 @@ function maskMeta(meta) {
|
|
|
521
526
|
return masked;
|
|
522
527
|
}
|
|
523
528
|
function write(level, message, meta) {
|
|
529
|
+
if (stderrBroken == true) {
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
524
532
|
const threshold = resolveThreshold();
|
|
525
533
|
if (threshold === "silent") {
|
|
526
534
|
return;
|
|
@@ -534,8 +542,12 @@ function write(level, message, meta) {
|
|
|
534
542
|
if (Object.keys(masked).length > 0) {
|
|
535
543
|
line += ` ${JSON.stringify(masked)}`;
|
|
536
544
|
}
|
|
537
|
-
|
|
545
|
+
try {
|
|
546
|
+
process.stderr.write(`${line}
|
|
538
547
|
`);
|
|
548
|
+
} catch {
|
|
549
|
+
stderrBroken = true;
|
|
550
|
+
}
|
|
539
551
|
}
|
|
540
552
|
function createLogger(boundMeta) {
|
|
541
553
|
return {
|
|
@@ -4834,7 +4846,7 @@ async function manageHost(prompter, output, target, entries, name) {
|
|
|
4834
4846
|
}
|
|
4835
4847
|
}
|
|
4836
4848
|
}
|
|
4837
|
-
async function
|
|
4849
|
+
async function runConfigCommand(options) {
|
|
4838
4850
|
const { input, output } = options;
|
|
4839
4851
|
const targets = options.targets ?? listConfigTargets();
|
|
4840
4852
|
let target = targets[0];
|
|
@@ -5644,12 +5656,11 @@ function createSshMcpServer() {
|
|
|
5644
5656
|
}
|
|
5645
5657
|
|
|
5646
5658
|
// src/cli.ts
|
|
5647
|
-
var SETUP_COMMAND_NAMES = ["setup", "config"];
|
|
5648
5659
|
function parseArguments(argv) {
|
|
5649
|
-
const parsed = { showHelp: false, showVersion: false, checkOnly: false,
|
|
5660
|
+
const parsed = { showHelp: false, showVersion: false, checkOnly: false, configMode: false };
|
|
5650
5661
|
let rest = argv;
|
|
5651
|
-
if (argv[0]
|
|
5652
|
-
parsed.
|
|
5662
|
+
if (argv[0] === "config") {
|
|
5663
|
+
parsed.configMode = true;
|
|
5653
5664
|
rest = argv.slice(1);
|
|
5654
5665
|
}
|
|
5655
5666
|
for (let index = 0; index < rest.length; index += 1) {
|
|
@@ -5683,17 +5694,17 @@ var HELP_TEXT = [
|
|
|
5683
5694
|
"",
|
|
5684
5695
|
"Usage:",
|
|
5685
5696
|
" akms-mcp-ssh [--check]",
|
|
5686
|
-
" akms-mcp-ssh
|
|
5697
|
+
" akms-mcp-ssh config [--target <client>]",
|
|
5687
5698
|
"",
|
|
5688
5699
|
"Commands:",
|
|
5689
|
-
"
|
|
5700
|
+
" config Manage the SSH hosts registered in an MCP client's config \u2014",
|
|
5690
5701
|
" list, add, edit, remove, check, print. Asks plain questions,",
|
|
5691
5702
|
" so the SSH_* names below never have to be typed.",
|
|
5692
5703
|
"",
|
|
5693
5704
|
"Options:",
|
|
5694
5705
|
" --check Connect to the configured host, report the result, and exit.",
|
|
5695
5706
|
" Prints the host key fingerprint so it can be pinned.",
|
|
5696
|
-
" --target <id>
|
|
5707
|
+
" --target <id> config: claude-code | codex | claude-desktop | cursor",
|
|
5697
5708
|
" (default: the first one installed)",
|
|
5698
5709
|
" -v, --version Print the version and exit",
|
|
5699
5710
|
" -h, --help Print this help and exit",
|
|
@@ -5727,7 +5738,7 @@ var HELP_TEXT = [
|
|
|
5727
5738
|
].join("\n");
|
|
5728
5739
|
async function runCheckCommand(profile) {
|
|
5729
5740
|
if (profile == null) {
|
|
5730
|
-
process.stdout.write(`No SSH host is registered \u2014 set ${SINGLE_HOST_ENV.HOST} and ${SINGLE_HOST_ENV.USER}, or run: akms-mcp-ssh
|
|
5741
|
+
process.stdout.write(`No SSH host is registered \u2014 set ${SINGLE_HOST_ENV.HOST} and ${SINGLE_HOST_ENV.USER}, or run: akms-mcp-ssh config
|
|
5731
5742
|
`);
|
|
5732
5743
|
return 1;
|
|
5733
5744
|
}
|
|
@@ -5739,6 +5750,11 @@ async function runCheckCommand(profile) {
|
|
|
5739
5750
|
}
|
|
5740
5751
|
async function main() {
|
|
5741
5752
|
const _logger = $logger.child({ context: "cli" });
|
|
5753
|
+
if (process.argv[2] === "setup") {
|
|
5754
|
+
process.stderr.write("The setup command has been removed. Use akms-mcp-ssh config.\n");
|
|
5755
|
+
process.exitCode = 1;
|
|
5756
|
+
return;
|
|
5757
|
+
}
|
|
5742
5758
|
const cliArguments = parseArguments(process.argv.slice(2));
|
|
5743
5759
|
if (cliArguments.showHelp == true) {
|
|
5744
5760
|
process.stderr.write(`${HELP_TEXT}
|
|
@@ -5750,11 +5766,11 @@ async function main() {
|
|
|
5750
5766
|
`);
|
|
5751
5767
|
return;
|
|
5752
5768
|
}
|
|
5753
|
-
if (cliArguments.
|
|
5769
|
+
if (cliArguments.configMode == true) {
|
|
5754
5770
|
if (process.env[LOG_LEVEL_ENV] == null) {
|
|
5755
5771
|
process.env[LOG_LEVEL_ENV] = "warn";
|
|
5756
5772
|
}
|
|
5757
|
-
const exitCode = await
|
|
5773
|
+
const exitCode = await runConfigCommand({
|
|
5758
5774
|
input: process.stdin,
|
|
5759
5775
|
output: process.stdout,
|
|
5760
5776
|
targetId: cliArguments.targetId
|
|
@@ -5770,6 +5786,12 @@ async function main() {
|
|
|
5770
5786
|
instance.shutdown();
|
|
5771
5787
|
process.exit(exitCode);
|
|
5772
5788
|
}
|
|
5789
|
+
process.on("uncaughtException", (error) => {
|
|
5790
|
+
_logger.error(error, "uncaught exception; the server keeps running");
|
|
5791
|
+
});
|
|
5792
|
+
process.on("unhandledRejection", (reason) => {
|
|
5793
|
+
_logger.error(reason, "unhandled rejection; the server keeps running");
|
|
5794
|
+
});
|
|
5773
5795
|
let shuttingDown = false;
|
|
5774
5796
|
const shutdown = (signal) => {
|
|
5775
5797
|
if (shuttingDown == true) {
|
|
@@ -5777,6 +5799,10 @@ async function main() {
|
|
|
5777
5799
|
}
|
|
5778
5800
|
shuttingDown = true;
|
|
5779
5801
|
_logger.info("shutting down", { signal });
|
|
5802
|
+
setTimeout(() => {
|
|
5803
|
+
_logger.warn("shutdown did not finish in time; exiting anyway", { deadline_ms: SHUTDOWN_DEADLINE_MS });
|
|
5804
|
+
process.exit(0);
|
|
5805
|
+
}, SHUTDOWN_DEADLINE_MS).unref();
|
|
5780
5806
|
instance.shutdown();
|
|
5781
5807
|
void instance.server.close().finally(() => {
|
|
5782
5808
|
process.exit(0);
|
|
@@ -5796,7 +5822,8 @@ async function main() {
|
|
|
5796
5822
|
_logger.info("mcp server ready on stdio", {
|
|
5797
5823
|
server: SERVER_NAME,
|
|
5798
5824
|
version: SERVER_VERSION,
|
|
5799
|
-
profile: instance.profile?.name ?? null
|
|
5825
|
+
profile: instance.profile?.name ?? null,
|
|
5826
|
+
pid: process.pid
|
|
5800
5827
|
});
|
|
5801
5828
|
}
|
|
5802
5829
|
main().catch((error) => {
|