@elvatis_com/elvatis-mcp 1.0.5 → 1.0.7
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/.mcp.json.example +15 -0
- package/README.md +1 -1
- package/dist/ssh.d.ts.map +1 -1
- package/dist/ssh.js +29 -26
- package/dist/ssh.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"elvatis-mcp": {
|
|
4
|
+
"command": "node",
|
|
5
|
+
"args": ["./dist/index.js"],
|
|
6
|
+
"cwd": "/absolute/path/to/elvatis-mcp",
|
|
7
|
+
"env": {
|
|
8
|
+
"SSH_HOST": "192.168.x.x",
|
|
9
|
+
"SSH_PORT": "22",
|
|
10
|
+
"SSH_USER": "your-user",
|
|
11
|
+
"SSH_KEY_PATH": "/absolute/path/to/.ssh/your_key"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
package/README.md
CHANGED
|
@@ -404,7 +404,7 @@ Open this file (create it if needed):
|
|
|
404
404
|
> On Windows, always use full absolute paths. The MSIX sandbox does not resolve `~` or relative paths.
|
|
405
405
|
|
|
406
406
|
#### Claude Code (this project)
|
|
407
|
-
`.mcp.json`
|
|
407
|
+
Copy `.mcp.json.example` to `.mcp.json` (gitignored, never committed) and fill in your paths and SSH details. Then copy `.env.example` to `.env` for the remaining config.
|
|
408
408
|
|
|
409
409
|
#### Claude Code (global)
|
|
410
410
|
```bash
|
package/dist/ssh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;CACjB;AA6BD;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlG;AAsFD,mFAAmF;AACnF,wBAAsB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErF;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItG"}
|
package/dist/ssh.js
CHANGED
|
@@ -47,29 +47,24 @@ const child_process_1 = require("child_process");
|
|
|
47
47
|
const os = __importStar(require("os"));
|
|
48
48
|
const path = __importStar(require("path"));
|
|
49
49
|
/**
|
|
50
|
-
* Resolve the SSH binary
|
|
51
|
-
* Claude Desktop (MSIX) and Claude Code may
|
|
52
|
-
*
|
|
53
|
-
* depend on PATH resolution inside a sandboxed child process.
|
|
50
|
+
* Resolve the SSH binary path.
|
|
51
|
+
* On Windows, Claude Desktop (MSIX) and Claude Code may run with a restricted
|
|
52
|
+
* PATH. Use the full absolute path to avoid PATH resolution issues entirely.
|
|
54
53
|
*/
|
|
54
|
+
function sshBinary() {
|
|
55
|
+
if (process.platform === 'win32') {
|
|
56
|
+
const root = process.env['SystemRoot'] || process.env['systemroot'] || 'C:\\Windows';
|
|
57
|
+
return path.join(root, 'System32', 'OpenSSH', 'ssh.exe');
|
|
58
|
+
}
|
|
59
|
+
return 'ssh';
|
|
60
|
+
}
|
|
55
61
|
/**
|
|
56
|
-
* Build
|
|
57
|
-
*
|
|
58
|
-
* the
|
|
62
|
+
* Build the environment for the SSH child process.
|
|
63
|
+
* Keep it simple: inherit process.env with HOME set.
|
|
64
|
+
* No PATH manipulation — using the absolute ssh binary path instead.
|
|
59
65
|
*/
|
|
60
66
|
function sshEnv() {
|
|
61
|
-
|
|
62
|
-
if (process.platform === 'win32') {
|
|
63
|
-
const root = process.env['SystemRoot'] || 'C:\\Windows';
|
|
64
|
-
const sshDirs = [
|
|
65
|
-
path.join(root, 'System32', 'OpenSSH'),
|
|
66
|
-
path.join(root, 'Sysnative', 'OpenSSH'),
|
|
67
|
-
];
|
|
68
|
-
const currentPath = env['PATH'] || env['Path'] || '';
|
|
69
|
-
// Prepend SSH directories so they are found first
|
|
70
|
-
env['PATH'] = sshDirs.join(';') + ';' + currentPath;
|
|
71
|
-
}
|
|
72
|
-
return env;
|
|
67
|
+
return { ...process.env, HOME: os.homedir() };
|
|
73
68
|
}
|
|
74
69
|
/** Normalize a file path to forward slashes (SSH on Windows needs this). */
|
|
75
70
|
function normalizePath(p) {
|
|
@@ -99,10 +94,11 @@ function sshExecOnce(cfg, command, timeoutMs) {
|
|
|
99
94
|
// Expand ~ and normalize to forward slashes for cross-platform SSH compatibility
|
|
100
95
|
const keyPath = normalizePath(cfg.keyPath.replace(/^~/, os.homedir()));
|
|
101
96
|
const debug = process.env['SSH_DEBUG'] === '1';
|
|
97
|
+
const nullDevice = process.platform === 'win32' ? 'NUL' : '/dev/null';
|
|
102
98
|
const args = [
|
|
103
99
|
'-i', keyPath,
|
|
104
100
|
'-o', 'StrictHostKeyChecking=no',
|
|
105
|
-
'-o',
|
|
101
|
+
'-o', `UserKnownHostsFile=${nullDevice}`,
|
|
106
102
|
'-o', 'LogLevel=ERROR',
|
|
107
103
|
'-o', 'BatchMode=yes',
|
|
108
104
|
'-o', 'ConnectTimeout=10',
|
|
@@ -114,14 +110,21 @@ function sshExecOnce(cfg, command, timeoutMs) {
|
|
|
114
110
|
args.push('-vvv');
|
|
115
111
|
}
|
|
116
112
|
args.push(`${cfg.username}@${cfg.host}`, command);
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
stdio: ['
|
|
113
|
+
const proc = (0, child_process_1.spawn)(sshBinary(), args, {
|
|
114
|
+
// Use 'pipe' for stdin (not 'ignore') so Windows OpenSSH gets a valid
|
|
115
|
+
// stdin handle. 'ignore' in Electron-spawned Node leaves stdin as
|
|
116
|
+
// INVALID_HANDLE_VALUE which causes Windows ssh.exe to exit 255 silently.
|
|
117
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
122
118
|
windowsHide: true,
|
|
123
119
|
env: sshEnv(),
|
|
120
|
+
// Explicitly set cwd to a writable directory. When the MCP server is
|
|
121
|
+
// launched by Claude Code (Electron), process.cwd() is C:\Windows\System32
|
|
122
|
+
// which is write-protected. ssh.exe fails silently at startup if it cannot
|
|
123
|
+
// write temp/lock files in its working directory.
|
|
124
|
+
cwd: os.tmpdir(),
|
|
124
125
|
});
|
|
126
|
+
// Immediately signal EOF on stdin — SSH doesn't need input from us.
|
|
127
|
+
proc.stdin.end();
|
|
125
128
|
let stdout = '';
|
|
126
129
|
let stderr = '';
|
|
127
130
|
proc.stdout.on('data', (d) => { stdout += d.toString(); });
|
|
@@ -146,7 +149,7 @@ function sshExecOnce(cfg, command, timeoutMs) {
|
|
|
146
149
|
proc.on('error', (err) => {
|
|
147
150
|
clearTimeout(timer);
|
|
148
151
|
if (err.code === 'ENOENT') {
|
|
149
|
-
reject(new Error(
|
|
152
|
+
reject(new Error(`ssh binary not found at ${sshBinary()}. ` +
|
|
150
153
|
'Windows: Settings > Optional Features > OpenSSH Client. ' +
|
|
151
154
|
'macOS/Linux: should be pre-installed.'));
|
|
152
155
|
}
|
package/dist/ssh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elvatis_com/elvatis-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "MCP server for OpenClaw — expose smart home, memory, cron, and more to Claude Desktop, Cursor, Windsurf, and any MCP client",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -44,7 +44,8 @@
|
|
|
44
44
|
"dist",
|
|
45
45
|
"README.md",
|
|
46
46
|
"LICENSE",
|
|
47
|
-
".env.example"
|
|
47
|
+
".env.example",
|
|
48
|
+
".mcp.json.example"
|
|
48
49
|
],
|
|
49
50
|
"repository": {
|
|
50
51
|
"type": "git",
|