ssh-mcp-pro 1.5.0 → 1.6.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.
Files changed (91) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/MIGRATION.md +1 -1
  3. package/README.md +1 -1
  4. package/dist/agent-bin.js +2 -2
  5. package/dist/agent-bin.js.map +1 -1
  6. package/dist/mcp.d.ts +1 -1
  7. package/dist/mcp.js +1 -1
  8. package/dist/remote/action-record-sanitize.d.ts +4 -0
  9. package/dist/remote/action-record-sanitize.d.ts.map +1 -0
  10. package/dist/remote/action-record-sanitize.js +11 -0
  11. package/dist/remote/action-record-sanitize.js.map +1 -0
  12. package/dist/remote/agent-bounded-io.d.ts +10 -0
  13. package/dist/remote/agent-bounded-io.d.ts.map +1 -1
  14. package/dist/remote/agent-bounded-io.js +34 -0
  15. package/dist/remote/agent-bounded-io.js.map +1 -1
  16. package/dist/remote/agent-browser-enrollment.d.ts +16 -0
  17. package/dist/remote/agent-browser-enrollment.d.ts.map +1 -0
  18. package/dist/remote/agent-browser-enrollment.js +190 -0
  19. package/dist/remote/agent-browser-enrollment.js.map +1 -0
  20. package/dist/remote/agent-cli.d.ts +5 -0
  21. package/dist/remote/agent-cli.d.ts.map +1 -1
  22. package/dist/remote/agent-cli.js +91 -14
  23. package/dist/remote/agent-cli.js.map +1 -1
  24. package/dist/remote/agent-content-search.d.ts +20 -0
  25. package/dist/remote/agent-content-search.d.ts.map +1 -0
  26. package/dist/remote/agent-content-search.js +61 -0
  27. package/dist/remote/agent-content-search.js.map +1 -0
  28. package/dist/remote/agent-executor.d.ts +5 -0
  29. package/dist/remote/agent-executor.d.ts.map +1 -1
  30. package/dist/remote/agent-executor.js +98 -10
  31. package/dist/remote/agent-executor.js.map +1 -1
  32. package/dist/remote/agent-file-search.d.ts +22 -0
  33. package/dist/remote/agent-file-search.d.ts.map +1 -0
  34. package/dist/remote/agent-file-search.js +243 -0
  35. package/dist/remote/agent-file-search.js.map +1 -0
  36. package/dist/remote/agent-managed-process.d.ts +43 -0
  37. package/dist/remote/agent-managed-process.d.ts.map +1 -0
  38. package/dist/remote/agent-managed-process.js +291 -0
  39. package/dist/remote/agent-managed-process.js.map +1 -0
  40. package/dist/remote/control-plane.d.ts.map +1 -1
  41. package/dist/remote/control-plane.js +2 -1
  42. package/dist/remote/control-plane.js.map +1 -1
  43. package/dist/remote/dashboard-enrollment-commands.d.ts +1 -0
  44. package/dist/remote/dashboard-enrollment-commands.d.ts.map +1 -1
  45. package/dist/remote/dashboard-enrollment-commands.js +8 -0
  46. package/dist/remote/dashboard-enrollment-commands.js.map +1 -1
  47. package/dist/remote/dashboard-enrollment-feedback-script.d.ts +3 -0
  48. package/dist/remote/dashboard-enrollment-feedback-script.d.ts.map +1 -0
  49. package/dist/remote/dashboard-enrollment-feedback-script.js +227 -0
  50. package/dist/remote/dashboard-enrollment-feedback-script.js.map +1 -0
  51. package/dist/remote/mcp-tools.d.ts +1 -0
  52. package/dist/remote/mcp-tools.d.ts.map +1 -1
  53. package/dist/remote/mcp-tools.js +207 -3
  54. package/dist/remote/mcp-tools.js.map +1 -1
  55. package/dist/remote/safe-file.d.ts +19 -1
  56. package/dist/remote/safe-file.d.ts.map +1 -1
  57. package/dist/remote/safe-file.js +77 -3
  58. package/dist/remote/safe-file.js.map +1 -1
  59. package/dist/remote/schemas.d.ts +16 -0
  60. package/dist/remote/schemas.d.ts.map +1 -1
  61. package/dist/remote/schemas.js +1 -0
  62. package/dist/remote/schemas.js.map +1 -1
  63. package/dist/remote/store.d.ts +2 -3
  64. package/dist/remote/store.d.ts.map +1 -1
  65. package/dist/remote/store.js +15 -3
  66. package/dist/remote/store.js.map +1 -1
  67. package/dist/remote/types.d.ts +3 -2
  68. package/dist/remote/types.d.ts.map +1 -1
  69. package/dist/remote/types.js +15 -0
  70. package/dist/remote/types.js.map +1 -1
  71. package/dist/remote/web-dashboard-html.d.ts.map +1 -1
  72. package/dist/remote/web-dashboard-html.js +25 -27
  73. package/dist/remote/web-dashboard-html.js.map +1 -1
  74. package/dist/remote/web-dashboard-styles.d.ts +1 -1
  75. package/dist/remote/web-dashboard-styles.d.ts.map +1 -1
  76. package/dist/remote/web-dashboard-styles.js +2 -0
  77. package/dist/remote/web-dashboard-styles.js.map +1 -1
  78. package/dist/remote/web-dashboard.d.ts.map +1 -1
  79. package/dist/remote/web-dashboard.js +9 -2
  80. package/dist/remote/web-dashboard.js.map +1 -1
  81. package/dist/types.d.ts +1 -1
  82. package/docs/adding-a-device.md +187 -11
  83. package/docs/backup-restore-verification.md +45 -0
  84. package/docs/coolify.md +9 -0
  85. package/docs/development/local-setup.md +1 -1
  86. package/docs/reference/compatibility.md +1 -1
  87. package/docs/tutorials/getting-started.md +1 -1
  88. package/mcp.json +1 -1
  89. package/package.json +2 -2
  90. package/registry/ssh-mcp-pro/mcp.json +1 -1
  91. package/server.json +3 -3
@@ -72,12 +72,37 @@ returned token with the installer in Step 2 or the returned npm commands.
72
72
  ## Step 2 — Run the bootstrap on the new device
73
73
 
74
74
  The Linux/Windows bootstrap installs the package, enrolls the machine, and
75
- registers startup so the agent reconnects after restarts. It needs Node
76
- 22.22+ or 24+. The dashboard-generated command is the shortest path; the
77
- manual commands below are alternatives if you already have a one-time token.
75
+ registers startup so the agent reconnects after restarts. On Linux/WSL,
76
+ the user-mode installer automatically installs verified **Node 26 LTS** into
77
+ the user's private directory if Node.js/npm is missing or too old. It checks
78
+ the official Node.js release signature and SHA-256 checksum before using the
79
+ binary; no sudo, system-wide Node changes or additional commands are needed.
80
+ System-wide Linux services still require a trusted system-installed Node
81
+ runtime. On Windows, if Node.js is missing, the installer attempts to install
82
+ the official Active LTS through Windows Package Manager (WinGet). The
83
+ dashboard-generated command is the shortest path; the manual commands below
84
+ are alternatives if you already have a one-time token.
78
85
 
79
86
  ### Linux / WSL
80
87
 
88
+ **Same-device browser setup (recommended for Linux/WSL with a browser):**
89
+
90
+ From the authenticated dashboard's **Add Device** tab, copy the
91
+ **Linux / WSL: Set up with your browser** command and run it in the
92
+ device's own terminal. It installs a verified user-local Node LTS if needed,
93
+ installs the agent and prints an HTTPS approval link. Open that link in a
94
+ browser on the **same device** (including a Windows browser that can reach
95
+ WSL loopback), sign in, choose the initial policy and click **Approve This
96
+ Device**. The one-time enrollment token is handed directly to the agent's
97
+ temporary `127.0.0.1` listener; it is never copied to a chat, terminal
98
+ argument or browser URL. The listener accepts only the control-plane origin
99
+ plus a random one-time link challenge and expires after 10 minutes. Browser
100
+ privacy/localhost network protections must allow the connection. If the
101
+ browser is on another machine, use the existing manual command instead.
102
+
103
+ For **headless or remote-only devices**, the existing manually generated
104
+ one-time token and installation command remain supported:
105
+
81
106
  ```bash
82
107
  curl -fsSL https://raw.githubusercontent.com/oaslananka/ssh-mcp-pro/main/scripts/install-agent.sh -o install-agent.sh
83
108
  bash install-agent.sh \
@@ -86,20 +111,73 @@ bash install-agent.sh \
86
111
  --alias office-pc
87
112
  ```
88
113
 
89
- This creates a **user** systemd service and enables linger so it survives
90
- logout and starts at boot. Pass `--system` (with `sudo`) to install a
91
- system-wide service instead.
114
+ This creates a **user** systemd service and enables linger. On a normal
115
+ Linux installation, that lets the agent survive logout and start with the
116
+ systemd user manager at boot. **WSL is different:** Microsoft documents that
117
+ systemd services do **not** keep a WSL instance alive. Windows can shut down
118
+ an idle WSL instance even when the service is enabled and `Linger=yes`.
119
+ For an always-on agent on a Windows PC, use the **native Windows installer**
120
+ below instead. Only use WSL as a persistent agent host if you deliberately
121
+ configure and verify its Windows-side startup/lifetime behavior; the Linux
122
+ installer does not silently create a Windows task or disable WSL idling.
123
+ See [Microsoft's WSL systemd documentation](https://learn.microsoft.com/en-us/windows/wsl/systemd).
124
+
125
+ If enabling linger is denied, the installer reports **incomplete setup**
126
+ instead of claiming success: even on ordinary Linux, the running agent may
127
+ disconnect when the user logs out. Ask an administrator to run
128
+ `sudo loginctl enable-linger <linux-username>`, then verify
129
+ `loginctl show-user <linux-username> -p Linger` reports `Linger=yes`.
130
+ This repair does **not** require a new enrollment token. Pass `--system`
131
+ (with `sudo`) to install a system-wide service instead.
92
132
 
93
133
  ### Windows (PowerShell)
94
134
 
95
135
  ```powershell
96
- irm https://raw.githubusercontent.com/oaslananka/ssh-mcp-pro/main/scripts/install-agent.ps1 -OutFile install-agent.ps1
97
- ./install-agent.ps1 -Server https://your-control-plane.example.com -Token <one-time-token> -Alias office-pc
136
+ Invoke-RestMethod https://raw.githubusercontent.com/oaslananka/ssh-mcp-pro/main/scripts/install-agent.ps1 -OutFile install-agent.ps1
137
+ & ([scriptblock]::Create((Get-Content -LiteralPath ./install-agent.ps1 -Raw))) -Server 'https://your-control-plane.example.com' -Token '<one-time-token>' -Alias 'office-pc'
98
138
  ```
99
139
 
100
140
  This registers a Scheduled Task that runs the agent at logon and restarts it
101
- on failure. For a fully headless host that must run before any user logs in,
102
- run the agent under a service manager such as NSSM instead.
141
+ on failure. The dashboard's Windows one-liner is preferred: it downloads from
142
+ your authenticated HTTPS control plane and uses an in-memory script block,
143
+ so no machine-wide PowerShell execution-policy change is needed. The
144
+ installer invokes npm and the agent through their `.cmd` wrappers to avoid
145
+ blocked npm/agent `.ps1` shims. Review the installer source and only use a
146
+ trusted server. If Node.js is missing, WinGet will download and install
147
+ `OpenJS.NodeJS.LTS` from its official `winget` source, potentially prompting
148
+ for Windows administrator approval (UAC). Nothing bypasses that prompt. The
149
+ installer refreshes its own PATH and continues automatically when Node is
150
+ available. If WinGet is unavailable or the user declines installation, the
151
+ script exits with actionable guidance to install Node LTS from
152
+ https://nodejs.org/en/download and rerun the command. An *outdated* Windows Node
153
+ installation is not silently upgraded. On Linux/WSL, the user-scope fallback
154
+ also requires curl, tar, SHA-256 and GPG signature-verification tools; it
155
+ reports missing prerequisites rather than running unverified downloads.
156
+ The Node runtime and npm-installed agent are kept under
157
+ ~/.local/share/ssh-mcp-pro/, outside system locations.
158
+
159
+ ### Repair an existing Windows agent task
160
+
161
+ Earlier Windows installations may still have Task Scheduler's default 72-hour
162
+ process limit even though new installations now set unlimited runtime. If your
163
+ existing agent disconnects after a long uptime, open **administrator PowerShell**
164
+ and approve the normal UAC prompt. Run this **without re-enrolling**:
165
+
166
+ ```powershell
167
+ Invoke-RestMethod https://raw.githubusercontent.com/oaslananka/ssh-mcp-pro/main/scripts/repair-agent-task.ps1 -OutFile repair-agent-task.ps1
168
+ & ([scriptblock]::Create((Get-Content -LiteralPath ./repair-agent-task.ps1 -Raw)))
169
+ ```
170
+
171
+ The repair does not require a new enrollment token, does not reinstall Node or
172
+ npm, and does not restart the running agent. It verifies that the task runs
173
+ `ssh-mcp-pro-agent.cmd run`, then changes only `ExecutionTimeLimit` from
174
+ `PT72H` to `PT0S`. If the task already has unlimited runtime, it succeeds
175
+ without changes. If permissions are insufficient or the task looks unfamiliar,
176
+ it stops and reports an error instead of bypassing UAC or overwriting settings.
177
+ The existing restart-on-failure policy is preserved.
178
+
179
+ For a fully headless host that must run before any user logs in, run the agent
180
+ under a service manager such as NSSM instead.
103
181
 
104
182
  ## Step 3 — Verify
105
183
 
@@ -114,6 +192,100 @@ enrollment, **not** live connectivity. In the dashboard, open **Enrolled
114
192
  Devices** and verify the device reports **Live Online**. The audit log
115
193
  should contain `enrollment_token_created` and `agent_connected`.
116
194
 
195
+ ## Find files after connecting a device
196
+
197
+ Once a device is **Live Online** with an `operations` or explicitly
198
+ file-read-enabled policy, you can ask your MCP client:
199
+
200
+ > Find JSON configuration files on my connected device.
201
+
202
+ The hosted `file_search` tool needs the device alias and a `name_pattern`
203
+ such as `*.json` or `config`. You do not need to know the complete file path.
204
+ It searches the local policy's allowed folders by default, or you can specify
205
+ an allowed `root_path` to narrow the search. Results contain file paths only,
206
+ not file contents; use `file_read` to inspect a selected file afterward.
207
+
208
+ Searches default to depth 3 and up to 20 matches. At most 2,000 entries,
209
+ 128 directories, depth 5 and 50 matches are considered per invocation.
210
+ Hidden files are excluded unless requested. The response marks incomplete
211
+ searches as truncated; narrow the root or pattern for more precise results.
212
+ The agent skips symbolic links and does not search paths denied by its local
213
+ policy. Read-only profiles do not gain file access automatically.
214
+
215
+ ## Find a setting inside a file without knowing its location
216
+
217
+ When `files.read` is enabled, you can ask your AI client:
218
+
219
+ > On my connected device, find which configuration file contains
220
+ > `mode=advanced`, and show me where it appears.
221
+
222
+ The hosted `file_content_search` tool accepts `agent_id_or_alias` and a
223
+ literal `query`. It searches locally allowed folders, returning one matching
224
+ line number and a short snippet **per file**; it never edits files. You can
225
+ optionally restrict the filename with `name_pattern` (e.g. `*.ini`) or an
226
+ allowed `root_path`. The query is plain text, **not a regular expression**,
227
+ and is case-insensitive by default unless `case_sensitive: true` is passed.
228
+
229
+ One search examines at most 128 files of up to 128 KiB each, traverses at
230
+ most 128 directories and 2,000 entries, and returns at most 50 matches
231
+ (default 20). Depth defaults to 3 (maximum 5). Binary/invalid UTF-8 and
232
+ oversized files are skipped, hidden paths are excluded unless explicitly
233
+ requested, and symbolic links are not followed. A `truncated: true` result
234
+ means the scan or output limit was reached: narrow the filename/root and
235
+ search again. Long files can instead be inspected with paged `file_read`.
236
+
237
+ The control plane masks the search phrase in stored action metadata.
238
+ Matched snippets are still sent to the authenticated AI client, so avoid
239
+ requesting secrets or credentials unless they are genuinely needed.
240
+
241
+ ## Preview and apply one precise file edit
242
+
243
+ On an authorized device, clients with **both** `files.read` and
244
+ `files.write` can call `file_replace` instead of overwriting a whole file.
245
+ Give it an existing path, an exact `old_text` snippet and a `new_text` value.
246
+ The default `dry_run: true` returns a short diff and `before_sha256`
247
+ **without changing the file**.
248
+
249
+ To apply, call the same tool with `dry_run: false` and
250
+ `expected_sha256` equal to the preview's `before_sha256`. It replaces
251
+ **exactly one** occurrence, stages the new content as a temporary file,
252
+ checks the file hash again just before replacing the original, and reports
253
+ `FILE_CONFLICT` if it has changed. Reinspect/repreview after a conflict.
254
+ This is a best-effort optimistic stale-write check, **not** an atomic
255
+ compare-and-swap guarantee against concurrent external writes.
256
+
257
+ The agent refuses ambiguous/missing matches, non-UTF-8 text, files over
258
+ 1 MiB and edits that exceed its output limits. Files outside the local
259
+ allowlist and read-only profiles cannot use this tool. Normal
260
+ `file_write` remains unchanged for full-file edits.
261
+
262
+ ## Follow a long-running command without keeping a terminal open
263
+
264
+ When the agent's `shell.exec` capability is enabled, you can ask an AI
265
+ client: *"Start the test runner on my enrolled device, show its output, send
266
+ input if it asks, and stop it when I tell you."* The agent exposes four
267
+ tools that operate on a **user-owned process session**:
268
+
269
+ 1. `process_start`: provide `agent_id_or_alias` and `command`, optionally
270
+ `cwd` and `max_runtime_seconds` (1–600; default 300). Save the returned
271
+ `process_id`; the command runs on that device, not on the cloud server.
272
+ 2. `process_read`: supply the same agent and process ID, plus a `cursor`
273
+ (start at 0). It returns status, exit code, a bounded list of stdout/stderr
274
+ chunks, and `next_cursor` for the next read.
275
+ 3. `process_input`: send short stdin text or close stdin. Do not type
276
+ passwords/tokens into shell commands or client conversations.
277
+ 4. `process_stop`: terminate the process and its descendants when finished.
278
+
279
+ Sessions do not survive agent restart, disconnection or permission revocation.
280
+ A device supports up to four simultaneous managed processes; runtime and
281
+ output memory are bounded. When output exceeds the local 64 KiB ring buffer,
282
+ `dropped_before_cursor` indicates earlier content that can no longer be
283
+ retrieved. Finished process results are retained for at most two minutes.
284
+
285
+ The control plane masks managed command and stdin payloads in durable action
286
+ metadata; the AI client may still receive and display command output. This
287
+ tool does not elevate shell permissions or bypass the local device policy.
288
+
117
289
  ## Changing a policy later
118
290
 
119
291
  Capabilities are server-authoritative and pushed live to a connected agent —
@@ -144,6 +316,10 @@ restart is required.
144
316
  (`systemctl --user status ssh-mcp-pro-agent` on Linux, the Scheduled Task on
145
317
  Windows) and that the device can reach the control plane URL over HTTPS.
146
318
  - **Enrollment fails with an expired token**: tokens are single-use and
147
- short-lived. Create a fresh one and retry.
319
+ short-lived. An unused, never-connected pending device is removed after its
320
+ token expires, by the control plane's existing periodic cleanup (once per
321
+ minute). You can then generate a fresh command with the same alias; if the
322
+ alias is still reserved, refresh the device list after the next cleanup.
323
+ Already enrolled or revoked devices and the security audit remain intact.
148
324
  - **WebSocket error on start**: confirm Node 22.22+ or 24+, DNS/TLS
149
325
  connectivity to the configured server, and that the agent has not been revoked.
@@ -0,0 +1,45 @@
1
+ # Offline encrypted backup restore verification
2
+
3
+ Use this **before** authorizing a hosted release or rollback. It does **not**
4
+ change the running service or access live data. Backup existence, filename,
5
+ size or encryption header alone does not prove recoverability.
6
+
7
+ ## Independent recovery host
8
+
9
+ On an authorized isolated Linux host with Python 3, age and OpenSSL, obtain a
10
+ **separately stored encrypted backup** and its matching age identity using
11
+ your approved secure recovery process. Never paste the identity/private key
12
+ into chat, support requests, CI logs or a Git repository. Store the identity
13
+ as a private file (for example, file permissions 0600).
14
+
15
+ From a clean repository checkout, run:
16
+
17
+ ~~~bash
18
+ python3 scripts/verify-encrypted-backup.py \
19
+ --archive /secure/offsite/ssh-mcp-pro-backup.tar.gz.age \
20
+ --identity /secure/offsite/age-identity.txt
21
+ ~~~
22
+
23
+ Both .tar.age and .tar.gz.age formats are supported. The verifier requires a
24
+ consistent SQLite sshautomator.db including the users, agents and audit_events
25
+ tables, and matching Ed25519 PEM key pairs in control-plane-ed25519.json and
26
+ jwt-ed25519.json. It validates database integrity and foreign keys, and
27
+ validates each signing-key pair using OpenSSL. The archive is **never**
28
+ extracted directly to an embedded path: symbolic links, hardlinks and
29
+ parent-path traversal are rejected.
30
+
31
+ Success prints a small JSON status without database content or key material.
32
+ Any failure exits nonzero with a generic error code. Plaintext stays only in
33
+ a private temporary directory which is deleted automatically. Live files are
34
+ never overwritten.
35
+
36
+ **Release acceptance remains incomplete** until the backup is fresh and truly
37
+ offsite, its decryption identity is independently recoverable, and a controlled
38
+ isolated restore proves application startup, signed agent actions, OAuth
39
+ continuity, and rollback. Synthetic fixture tests are not production approval.
40
+
41
+ Run synthetic tests (no production credentials or data):
42
+
43
+ ~~~bash
44
+ python3 test/unit/backup_restore_verifier_test.py
45
+ ~~~
package/docs/coolify.md CHANGED
@@ -27,3 +27,12 @@ GITHUB_CALLBACK_URL=https://ssh-mcp-pro.oaslananka.dev/oauth/callback/github
27
27
  Dashboard login callback URLs additionally use `/auth/callback/google` and `/auth/callback/github`; register both with the relevant OAuth providers. Keep authentication allowlists configured as appropriate. Do not enable anonymous access as a workaround.
28
28
 
29
29
  Before deployment verify local OAuth login, dashboard and MCP flow. After deployment check health, login callbacks, device connectivity, and persistent state across a controlled restart. Do not run the SSH test fixture service in production.
30
+
31
+ ## Encrypted backup recovery gate
32
+
33
+ Before changing the hosted image, validate a fresh offsite encrypted SQLite
34
+ and signing-key backup on an independent recovery host. Follow
35
+ [offline backup restore verification](backup-restore-verification.md).
36
+ Passing offline integrity checks alone is **not** production restore or
37
+ rollback acceptance: demonstrate a controlled service startup and signed
38
+ agent/client action before authorizing the release.
@@ -9,7 +9,7 @@ it adds the one-command shortcuts.
9
9
  ```bash
10
10
  git clone https://github.com/oaslananka/ssh-mcp-pro.git
11
11
  cd ssh-mcp-pro
12
- task install # or: corepack enable && corepack prepare pnpm@11.28.10 --activate && pnpm install --frozen-lockfile
12
+ task install # or: corepack enable && corepack prepare pnpm@11.28.11 --activate && pnpm install --frozen-lockfile
13
13
  task verify # lint + format:check + typecheck + test + build
14
14
  ```
15
15
 
@@ -13,7 +13,7 @@ LTS line). This is expected, not an oversight.
13
13
 
14
14
  ## Package manager
15
15
 
16
- pnpm `11.28.10`, enforced via `packageManager` in `package.json` and `engine-strict=true`.
16
+ pnpm `11.28.11`, enforced via `packageManager` in `package.json` and `engine-strict=true`.
17
17
  npm/yarn are not supported installation paths for *developing* this repo (consumers
18
18
  installing the published package via npm/npx are unaffected — see
19
19
  [README.md#installation](../../README.md#installation)).
@@ -10,7 +10,7 @@ and [Reference](../reference/README.md) for the full option set.
10
10
 
11
11
  You need:
12
12
 
13
- - Node.js `>=22.22.2` (or `>=24.15.0` / `>=26.3.0`) and pnpm `^11.28.10`.
13
+ - Node.js `>=22.22.2` (or `>=24.15.0` / `>=26.3.0`) and pnpm `^11.28.11`.
14
14
  - At least one host you can already reach with plain `ssh`, with its key already in
15
15
  your `~/.ssh/known_hosts` (this tutorial uses the default `strict` host-key policy —
16
16
  see [SECURITY_DECISIONS.md](../../SECURITY_DECISIONS.md) for why).
package/mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "ssh-mcp-pro",
3
3
  "display_name": "ssh-mcp-pro",
4
4
  "description": "Secure MCP SSH automation server with policy controls, resources, prompts, stdio, and HTTP.",
5
- "version": "1.5.0",
5
+ "version": "1.6.0",
6
6
  "author": "Osman Aslan",
7
7
  "license": "MIT",
8
8
  "runtime": "node",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ssh-mcp-pro",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "mcpName": "io.github.oaslananka/ssh-mcp-pro",
5
5
  "description": "Model Context Protocol (MCP) SSH client server for remote automation",
6
6
  "type": "module",
@@ -58,7 +58,7 @@
58
58
  },
59
59
  "engines": {
60
60
  "node": ">=22.22.2",
61
- "pnpm": "^11.28.10"
61
+ "pnpm": "^11.28.11"
62
62
  },
63
63
  "dependencies": {
64
64
  "@modelcontextprotocol/node": "^2.1.2",
@@ -2,7 +2,7 @@
2
2
  "name": "ssh-mcp-pro",
3
3
  "display_name": "ssh-mcp-pro",
4
4
  "description": "Secure MCP SSH automation server with policy controls, resources, prompts, stdio, and HTTP.",
5
- "version": "1.5.0",
5
+ "version": "1.6.0",
6
6
  "author": "Osman Aslan",
7
7
  "license": "MIT",
8
8
  "runtime": "node",
package/server.json CHANGED
@@ -7,13 +7,13 @@
7
7
  "url": "https://github.com/oaslananka/ssh-mcp-pro",
8
8
  "source": "github"
9
9
  },
10
- "version": "1.5.0",
10
+ "version": "1.6.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "registryBaseUrl": "https://registry.npmjs.org",
15
15
  "identifier": "ssh-mcp-pro",
16
- "version": "1.5.0",
16
+ "version": "1.6.0",
17
17
  "transport": {
18
18
  "type": "stdio"
19
19
  }
@@ -22,7 +22,7 @@
22
22
  "registryType": "npm",
23
23
  "registryBaseUrl": "https://registry.npmjs.org",
24
24
  "identifier": "ssh-mcp-pro",
25
- "version": "1.5.0",
25
+ "version": "1.6.0",
26
26
  "runtimeHint": "npx",
27
27
  "transport": {
28
28
  "type": "streamable-http",