ssh-mcp-pro 1.2.3 → 1.4.2

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 (212) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/MIGRATION.md +2 -2
  3. package/README.md +34 -13
  4. package/SECURITY_DECISIONS.md +19 -0
  5. package/dist/agent-bin.js +5 -2
  6. package/dist/agent-bin.js.map +1 -1
  7. package/dist/cli.d.ts +1 -0
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +38 -47
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config-security-env.d.ts +4 -0
  12. package/dist/config-security-env.d.ts.map +1 -0
  13. package/dist/config-security-env.js +64 -0
  14. package/dist/config-security-env.js.map +1 -0
  15. package/dist/config-types.d.ts +82 -0
  16. package/dist/config-types.d.ts.map +1 -0
  17. package/dist/config-types.js +2 -0
  18. package/dist/config-types.js.map +1 -0
  19. package/dist/config.d.ts +3 -82
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +4 -67
  22. package/dist/config.js.map +1 -1
  23. package/dist/connector-profile.d.ts +1 -1
  24. package/dist/connector-profile.d.ts.map +1 -1
  25. package/dist/detect.d.ts.map +1 -1
  26. package/dist/detect.js +226 -192
  27. package/dist/detect.js.map +1 -1
  28. package/dist/ensure-package-service.d.ts +9 -0
  29. package/dist/ensure-package-service.d.ts.map +1 -0
  30. package/dist/ensure-package-service.js +146 -0
  31. package/dist/ensure-package-service.js.map +1 -0
  32. package/dist/ensure-pkg.js +4 -4
  33. package/dist/ensure-pkg.js.map +1 -1
  34. package/dist/ensure.d.ts.map +1 -1
  35. package/dist/ensure.js +15 -144
  36. package/dist/ensure.js.map +1 -1
  37. package/dist/fs-sftp.js +1 -1
  38. package/dist/fs-sftp.js.map +1 -1
  39. package/dist/fs-stat.d.ts +10 -0
  40. package/dist/fs-stat.d.ts.map +1 -0
  41. package/dist/fs-stat.js +62 -0
  42. package/dist/fs-stat.js.map +1 -0
  43. package/dist/fs-tools.d.ts.map +1 -1
  44. package/dist/fs-tools.js +6 -58
  45. package/dist/fs-tools.js.map +1 -1
  46. package/dist/http-security.d.ts.map +1 -1
  47. package/dist/http-security.js +6 -6
  48. package/dist/http-security.js.map +1 -1
  49. package/dist/http-server-runtime.d.ts.map +1 -1
  50. package/dist/http-server-runtime.js +41 -7
  51. package/dist/http-server-runtime.js.map +1 -1
  52. package/dist/index.js +7 -24
  53. package/dist/index.js.map +1 -1
  54. package/dist/mcp-http-web.d.ts +8 -0
  55. package/dist/mcp-http-web.d.ts.map +1 -0
  56. package/dist/mcp-http-web.js +35 -0
  57. package/dist/mcp-http-web.js.map +1 -0
  58. package/dist/mcp.d.ts +6 -2
  59. package/dist/mcp.d.ts.map +1 -1
  60. package/dist/mcp.js +22 -14
  61. package/dist/mcp.js.map +1 -1
  62. package/dist/policy.d.ts +8 -0
  63. package/dist/policy.d.ts.map +1 -1
  64. package/dist/policy.js +147 -105
  65. package/dist/policy.js.map +1 -1
  66. package/dist/process.d.ts.map +1 -1
  67. package/dist/process.js +11 -7
  68. package/dist/process.js.map +1 -1
  69. package/dist/remote/agent-activity-log.d.ts +26 -0
  70. package/dist/remote/agent-activity-log.d.ts.map +1 -0
  71. package/dist/remote/agent-activity-log.js +211 -0
  72. package/dist/remote/agent-activity-log.js.map +1 -0
  73. package/dist/remote/agent-cli.d.ts.map +1 -1
  74. package/dist/remote/agent-cli.js +153 -33
  75. package/dist/remote/agent-cli.js.map +1 -1
  76. package/dist/remote/agent-executor.d.ts.map +1 -1
  77. package/dist/remote/agent-executor.js +22 -10
  78. package/dist/remote/agent-executor.js.map +1 -1
  79. package/dist/remote/agent-handler.d.ts +2 -0
  80. package/dist/remote/agent-handler.d.ts.map +1 -1
  81. package/dist/remote/agent-handler.js +4 -0
  82. package/dist/remote/agent-handler.js.map +1 -1
  83. package/dist/remote/config.d.ts.map +1 -1
  84. package/dist/remote/config.js +12 -1
  85. package/dist/remote/config.js.map +1 -1
  86. package/dist/remote/control-plane.d.ts +12 -0
  87. package/dist/remote/control-plane.d.ts.map +1 -1
  88. package/dist/remote/control-plane.js +164 -56
  89. package/dist/remote/control-plane.js.map +1 -1
  90. package/dist/remote/crypto.d.ts +9 -4
  91. package/dist/remote/crypto.d.ts.map +1 -1
  92. package/dist/remote/crypto.js +41 -9
  93. package/dist/remote/crypto.js.map +1 -1
  94. package/dist/remote/http-util.d.ts.map +1 -1
  95. package/dist/remote/http-util.js +14 -7
  96. package/dist/remote/http-util.js.map +1 -1
  97. package/dist/remote/mcp-tools.d.ts +7 -0
  98. package/dist/remote/mcp-tools.d.ts.map +1 -1
  99. package/dist/remote/mcp-tools.js +28 -0
  100. package/dist/remote/mcp-tools.js.map +1 -1
  101. package/dist/remote/oauth-handler.d.ts +30 -3
  102. package/dist/remote/oauth-handler.d.ts.map +1 -1
  103. package/dist/remote/oauth-handler.js +232 -18
  104. package/dist/remote/oauth-handler.js.map +1 -1
  105. package/dist/remote/policy.js +2 -2
  106. package/dist/remote/policy.js.map +1 -1
  107. package/dist/remote/schemas.d.ts +9 -9
  108. package/dist/remote/schemas.js +6 -6
  109. package/dist/remote/schemas.js.map +1 -1
  110. package/dist/remote/store.d.ts +38 -1
  111. package/dist/remote/store.d.ts.map +1 -1
  112. package/dist/remote/store.js +149 -11
  113. package/dist/remote/store.js.map +1 -1
  114. package/dist/remote/types.d.ts +14 -0
  115. package/dist/remote/types.d.ts.map +1 -1
  116. package/dist/remote/types.js.map +1 -1
  117. package/dist/remote/web-dashboard-client-config.d.ts +77 -0
  118. package/dist/remote/web-dashboard-client-config.d.ts.map +1 -0
  119. package/dist/remote/web-dashboard-client-config.js +81 -0
  120. package/dist/remote/web-dashboard-client-config.js.map +1 -0
  121. package/dist/remote/web-dashboard-html.d.ts +2 -0
  122. package/dist/remote/web-dashboard-html.d.ts.map +1 -0
  123. package/dist/remote/web-dashboard-html.js +451 -0
  124. package/dist/remote/web-dashboard-html.js.map +1 -0
  125. package/dist/remote/web-dashboard-oauth-users.d.ts +4 -0
  126. package/dist/remote/web-dashboard-oauth-users.d.ts.map +1 -0
  127. package/dist/remote/web-dashboard-oauth-users.js +78 -0
  128. package/dist/remote/web-dashboard-oauth-users.js.map +1 -0
  129. package/dist/remote/web-dashboard-static.d.ts +4 -0
  130. package/dist/remote/web-dashboard-static.d.ts.map +1 -0
  131. package/dist/remote/web-dashboard-static.js +19 -0
  132. package/dist/remote/web-dashboard-static.js.map +1 -0
  133. package/dist/remote/web-dashboard-styles.d.ts +2 -0
  134. package/dist/remote/web-dashboard-styles.d.ts.map +1 -0
  135. package/dist/remote/web-dashboard-styles.js +206 -0
  136. package/dist/remote/web-dashboard-styles.js.map +1 -0
  137. package/dist/remote/web-dashboard.d.ts +62 -0
  138. package/dist/remote/web-dashboard.d.ts.map +1 -0
  139. package/dist/remote/web-dashboard.js +467 -0
  140. package/dist/remote/web-dashboard.js.map +1 -0
  141. package/dist/retry.d.ts.map +1 -1
  142. package/dist/retry.js +6 -3
  143. package/dist/retry.js.map +1 -1
  144. package/dist/safety.d.ts.map +1 -1
  145. package/dist/safety.js +56 -6
  146. package/dist/safety.js.map +1 -1
  147. package/dist/session-auth.js +7 -7
  148. package/dist/session-auth.js.map +1 -1
  149. package/dist/session.d.ts +1 -0
  150. package/dist/session.d.ts.map +1 -1
  151. package/dist/session.js +44 -40
  152. package/dist/session.js.map +1 -1
  153. package/dist/shell.d.ts.map +1 -1
  154. package/dist/shell.js +5 -4
  155. package/dist/shell.js.map +1 -1
  156. package/dist/ssh-config.d.ts +2 -2
  157. package/dist/ssh-config.d.ts.map +1 -1
  158. package/dist/ssh-config.js +24 -20
  159. package/dist/ssh-config.js.map +1 -1
  160. package/dist/telemetry.d.ts.map +1 -1
  161. package/dist/telemetry.js +9 -2
  162. package/dist/telemetry.js.map +1 -1
  163. package/dist/tools/connector.provider.d.ts +1 -1
  164. package/dist/tools/connector.provider.d.ts.map +1 -1
  165. package/dist/tools/ensure.provider.d.ts +1 -1
  166. package/dist/tools/ensure.provider.d.ts.map +1 -1
  167. package/dist/tools/fs.provider.d.ts +1 -1
  168. package/dist/tools/fs.provider.d.ts.map +1 -1
  169. package/dist/tools/metadata.d.ts +1 -1
  170. package/dist/tools/metadata.d.ts.map +1 -1
  171. package/dist/tools/output-schemas.d.ts +27 -135
  172. package/dist/tools/output-schemas.d.ts.map +1 -1
  173. package/dist/tools/process.provider.d.ts +1 -1
  174. package/dist/tools/process.provider.d.ts.map +1 -1
  175. package/dist/tools/registry.d.ts +1 -1
  176. package/dist/tools/registry.d.ts.map +1 -1
  177. package/dist/tools/registry.js +16 -13
  178. package/dist/tools/registry.js.map +1 -1
  179. package/dist/tools/session.provider.d.ts +1 -1
  180. package/dist/tools/session.provider.d.ts.map +1 -1
  181. package/dist/tools/system.provider.d.ts +1 -1
  182. package/dist/tools/system.provider.d.ts.map +1 -1
  183. package/dist/tools/transfer.provider.d.ts +1 -1
  184. package/dist/tools/transfer.provider.d.ts.map +1 -1
  185. package/dist/tools/tunnel.provider.d.ts +1 -1
  186. package/dist/tools/tunnel.provider.d.ts.map +1 -1
  187. package/dist/tools/types.d.ts +1 -1
  188. package/dist/tools/types.d.ts.map +1 -1
  189. package/dist/transfer.js +2 -2
  190. package/dist/transfer.js.map +1 -1
  191. package/dist/types.js +1 -1
  192. package/dist/types.js.map +1 -1
  193. package/docs/adding-a-device.md +39 -17
  194. package/docs/agent-activity-monitor.md +34 -0
  195. package/docs/coolify.md +29 -0
  196. package/docs/development/dependency-management.md +1 -1
  197. package/docs/development/local-setup.md +1 -1
  198. package/docs/development/mcp-protocol-2026.md +33 -0
  199. package/docs/docker.md +4 -4
  200. package/docs/doppler-guide.md +34 -0
  201. package/docs/openssf-evidence.md +11 -7
  202. package/docs/openssf-gap-analysis.md +7 -8
  203. package/docs/reference/cli.md +17 -6
  204. package/docs/reference/compatibility.md +1 -1
  205. package/docs/security/dependency-audit-exceptions.md +3 -7
  206. package/docs/security/hosted-data-inventory.md +81 -0
  207. package/docs/sonarcloud-analysis.md +9 -0
  208. package/docs/tutorials/getting-started.md +1 -1
  209. package/mcp.json +1 -1
  210. package/package.json +26 -21
  211. package/registry/ssh-mcp-pro/mcp.json +1 -1
  212. package/server.json +3 -3
package/CHANGELOG.md CHANGED
@@ -5,6 +5,77 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.4.2](https://github.com/oaslananka/ssh-mcp-pro/compare/ssh-mcp-pro-v1.4.1...ssh-mcp-pro-v1.4.2) (2026-11-10)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **cli:** validate agent commands and break config import cycle ([e216b93](https://github.com/oaslananka/ssh-mcp-pro/commit/e216b9347805579918b928a43c654fc5dce48197))
14
+
15
+ ## [1.4.1](https://github.com/oaslananka/ssh-mcp-pro/compare/ssh-mcp-pro-v1.4.0...ssh-mcp-pro-v1.4.1) (2026-11-10)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * bind agent WebSocket to enrolled control-plane origin ([#194](https://github.com/oaslananka/ssh-mcp-pro/issues/194)) ([7ab181f](https://github.com/oaslananka/ssh-mcp-pro/commit/7ab181f474d283fb15358f467f89b42be2ba9236))
21
+ * harden Windows acceptance and dashboard onboarding ([#191](https://github.com/oaslananka/ssh-mcp-pro/issues/191)) ([d950b65](https://github.com/oaslananka/ssh-mcp-pro/commit/d950b65d42f4938e7b75feed94949a0d5a8e6050))
22
+ * make dashboard copy actions accessible and readable ([#193](https://github.com/oaslananka/ssh-mcp-pro/issues/193)) ([f6a8c94](https://github.com/oaslananka/ssh-mcp-pro/commit/f6a8c94e72b55b17296e795195710e21fe80672b))
23
+
24
+ ## [1.4.0](https://github.com/oaslananka/ssh-mcp-pro/compare/ssh-mcp-pro-v1.3.0...ssh-mcp-pro-v1.4.0) (2026-11-06)
25
+
26
+
27
+ ### Features
28
+
29
+ * **mcp:** support 2026 protocol on authenticated remote-agent endpoint ([#181](https://github.com/oaslananka/ssh-mcp-pro/issues/181)) ([8f5df37](https://github.com/oaslananka/ssh-mcp-pro/commit/8f5df3700657118d26743eebf314bdb3850cceb7))
30
+ * **remote:** add hosted dashboard and Coolify deployment support ([#127](https://github.com/oaslananka/ssh-mcp-pro/issues/127)) ([7a4ba63](https://github.com/oaslananka/ssh-mcp-pro/commit/7a4ba63cc8d2a3ec8080ecdddf57e854d08e1de2))
31
+
32
+
33
+ ### Bug Fixes
34
+
35
+ * **agent:** launch Windows scheduled task with npm CMD shim ([#130](https://github.com/oaslananka/ssh-mcp-pro/issues/130)) ([cf6fdb5](https://github.com/oaslananka/ssh-mcp-pro/commit/cf6fdb511af552d0538659a8fa7420bb586cfb69))
36
+ * **agent:** resolve Linux npm CLI discovery and system runtime identity ([#176](https://github.com/oaslananka/ssh-mcp-pro/issues/176)) ([16b7ce3](https://github.com/oaslananka/ssh-mcp-pro/commit/16b7ce3ea57931482e46af539223e2e481d47c35))
37
+ * **agent:** restart service after enrollment identity changes ([#180](https://github.com/oaslananka/ssh-mcp-pro/issues/180)) ([d770763](https://github.com/oaslananka/ssh-mcp-pro/commit/d770763936a5e1c7f0c40e87414a8917f1c21b7a))
38
+ * **agent:** restart Windows agent after WebSocket disconnect ([#129](https://github.com/oaslananka/ssh-mcp-pro/issues/129)) ([8df07ee](https://github.com/oaslananka/ssh-mcp-pro/commit/8df07ee08a55eb665679dffc33d8701b4e063ca9))
39
+ * **agent:** surface Linux installer download failures ([#132](https://github.com/oaslananka/ssh-mcp-pro/issues/132)) ([79f166d](https://github.com/oaslananka/ssh-mcp-pro/commit/79f166d50ffd52d0b9253b318703486fd5a72e8a))
40
+ * **apps:** correct publication legal-document attestations ([#157](https://github.com/oaslananka/ssh-mcp-pro/issues/157)) ([7e8b42d](https://github.com/oaslananka/ssh-mcp-pro/commit/7e8b42d9e5032c657fd65920c004bafc3d41abf6))
41
+ * **auth:** restrict fixture identities to loopback test mode ([#128](https://github.com/oaslananka/ssh-mcp-pro/issues/128)) ([a0a1d19](https://github.com/oaslananka/ssh-mcp-pro/commit/a0a1d1991dc665db3be2a017ddea039d4b642803))
42
+ * **automation:** avoid stalled dependency PR creation ([#153](https://github.com/oaslananka/ssh-mcp-pro/issues/153)) ([209c084](https://github.com/oaslananka/ssh-mcp-pro/commit/209c084294188a46baf878bfc326676b25e49781))
43
+ * **dashboard:** correct Gemini and Copilot setup examples ([#161](https://github.com/oaslananka/ssh-mcp-pro/issues/161)) ([be00c8c](https://github.com/oaslananka/ssh-mcp-pro/commit/be00c8c0f77c38d08b6b68f78e6fe2118c1bfeb2))
44
+ * **dashboard:** correct MCP client setup examples ([#146](https://github.com/oaslananka/ssh-mcp-pro/issues/146)) ([71ed56a](https://github.com/oaslananka/ssh-mcp-pro/commit/71ed56a45f024812cf15d89f4de861cf631a65bd))
45
+ * **dashboard:** display host metadata and stream agent activity logs ([#183](https://github.com/oaslananka/ssh-mcp-pro/issues/183)) ([30d294a](https://github.com/oaslananka/ssh-mcp-pro/commit/30d294acb367ae06d25ec1caff9f68bad113ea2d))
46
+ * **dashboard:** distinguish remote MCP connector setup ([#147](https://github.com/oaslananka/ssh-mcp-pro/issues/147)) ([621948d](https://github.com/oaslananka/ssh-mcp-pro/commit/621948d03bffe62282daa96dbb41d741aca83311))
47
+ * **dashboard:** make navigation keyboard accessible ([#160](https://github.com/oaslananka/ssh-mcp-pro/issues/160)) ([6261f7f](https://github.com/oaslananka/ssh-mcp-pro/commit/6261f7f3b92a53b7f9e474e6159aa36c468a6ed3))
48
+ * **dashboard:** remove revoked devices from inventory ([#149](https://github.com/oaslananka/ssh-mcp-pro/issues/149)) ([715edb8](https://github.com/oaslananka/ssh-mcp-pro/commit/715edb8511f908d70bb2400767942cd17e3bbe21))
49
+ * **dashboard:** separate device revoke and remove actions ([#182](https://github.com/oaslananka/ssh-mcp-pro/issues/182)) ([1e78176](https://github.com/oaslananka/ssh-mcp-pro/commit/1e7817642ebead581435fc169d9a46eed74fa6f6))
50
+ * **docs:** mark Google cloud connector as not publish-ready ([#134](https://github.com/oaslananka/ssh-mcp-pro/issues/134)) ([c3889af](https://github.com/oaslananka/ssh-mcp-pro/commit/c3889afda29889dfa3cbd96b55c28fe852fc9dc6))
51
+ * **http:** classify invalid JSON requests as bad input ([#136](https://github.com/oaslananka/ssh-mcp-pro/issues/136)) ([7fbbee2](https://github.com/oaslananka/ssh-mcp-pro/commit/7fbbee20f8ea141b36230dd8336d16172da525da))
52
+ * **http:** deny browser origins with no explicit allowlist ([#135](https://github.com/oaslananka/ssh-mcp-pro/issues/135)) ([ac3bf2c](https://github.com/oaslananka/ssh-mcp-pro/commit/ac3bf2cbdd6a63d92812b07b194b0b35269a040f))
53
+ * **oauth:** allow configured identity provider form redirects ([#150](https://github.com/oaslananka/ssh-mcp-pro/issues/150)) ([d78c067](https://github.com/oaslananka/ssh-mcp-pro/commit/d78c0676df29066e903bc53d2244944e6d82f819))
54
+ * **oauth:** prevent Chromium form redirects and restore enrollment tokens ([#179](https://github.com/oaslananka/ssh-mcp-pro/issues/179)) ([19f337c](https://github.com/oaslananka/ssh-mcp-pro/commit/19f337c9161e5496313349c66317586676cbb910))
55
+ * **oauth:** use registered Google callback for dashboard and MCP ([#178](https://github.com/oaslananka/ssh-mcp-pro/issues/178)) ([638d3f5](https://github.com/oaslananka/ssh-mcp-pro/commit/638d3f55ba4bb462c518a3fa8af3a4262c294414))
56
+ * **release:** add provenance-verified v1.3.0 asset recovery ([#126](https://github.com/oaslananka/ssh-mcp-pro/issues/126)) ([42254ec](https://github.com/oaslananka/ssh-mcp-pro/commit/42254ec23e50afa75cbd0fd467898fc93ab403f8))
57
+ * **release:** classify pinned legacy SSE migration bridge as advisory ([#123](https://github.com/oaslananka/ssh-mcp-pro/issues/123)) ([f262e93](https://github.com/oaslananka/ssh-mcp-pro/commit/f262e93c10465a96a002ee27c8dd77e69ad62dcb))
58
+ * **release:** sync Gemini connector version metadata ([#141](https://github.com/oaslananka/ssh-mcp-pro/issues/141)) ([feada05](https://github.com/oaslananka/ssh-mcp-pro/commit/feada051b38b7825a2142a0c8c78eae1b37e17f1))
59
+ * **remote:** advertise HSTS for HTTPS endpoints ([#155](https://github.com/oaslananka/ssh-mcp-pro/issues/155)) ([1c8baac](https://github.com/oaslananka/ssh-mcp-pro/commit/1c8baacb813a1dcb441a587c7b316999517fdddb))
60
+ * **remote:** prune expired transient credential records ([#159](https://github.com/oaslananka/ssh-mcp-pro/issues/159)) ([a8b0dfc](https://github.com/oaslananka/ssh-mcp-pro/commit/a8b0dfc9023f7e6d31b43d1004857b6b3b4e9c44))
61
+ * **test:** bind SSH fixture to loopback without sudo ([#133](https://github.com/oaslananka/ssh-mcp-pro/issues/133)) ([3c0a80f](https://github.com/oaslananka/ssh-mcp-pro/commit/3c0a80ffad507ab167a5ad7bc37a0ca513b478e6))
62
+
63
+ ## [1.3.0](https://github.com/oaslananka/ssh-mcp-pro/compare/ssh-mcp-pro-v1.2.3...ssh-mcp-pro-v1.3.0) (2026-11-02)
64
+
65
+
66
+ ### Features
67
+
68
+ * **mcp:** support 2026 protocol on standard transports ([#121](https://github.com/oaslananka/ssh-mcp-pro/issues/121)) ([c975504](https://github.com/oaslananka/ssh-mcp-pro/commit/c975504f1b0d0e8ea270be3f87f6191e8bec1fa9))
69
+
70
+
71
+ ### Bug Fixes
72
+
73
+ * **docker:** patch Alpine musl CVE-2026-107891 ([#98](https://github.com/oaslananka/ssh-mcp-pro/issues/98)) ([4186138](https://github.com/oaslananka/ssh-mcp-pro/commit/41861382dacfc3b25c6715b303f30d54f3c605bb))
74
+ * **quality:** remove stale lock helper and simplify safe string escaping ([#114](https://github.com/oaslananka/ssh-mcp-pro/issues/114)) ([d8d6c56](https://github.com/oaslananka/ssh-mcp-pro/commit/d8d6c565debc3cfbfb425ba16a71ad29e49c483c))
75
+ * **reliability:** report actual retry attempts and parallelize independent version checks ([#119](https://github.com/oaslananka/ssh-mcp-pro/issues/119)) ([bc64b36](https://github.com/oaslananka/ssh-mcp-pro/commit/bc64b36a33b15aa9a9ee418f4f06ccb4b87f33f0))
76
+ * **security:** reject unsafe Windows shim path characters ([#100](https://github.com/oaslananka/ssh-mcp-pro/issues/100)) ([083e133](https://github.com/oaslananka/ssh-mcp-pro/commit/083e133b81affb79a192ed6859f680ce0f79f478))
77
+ * **ssh:** apply multi-pattern Host options to every alias ([#120](https://github.com/oaslananka/ssh-mcp-pro/issues/120)) ([6d7b9f2](https://github.com/oaslananka/ssh-mcp-pro/commit/6d7b9f2a98712a18c6cb23002ed5a08152c0b02b))
78
+
8
79
  ## [1.2.3](https://github.com/oaslananka/ssh-mcp-pro/compare/ssh-mcp-pro-v1.2.2...ssh-mcp-pro-v1.2.3) (2026-10-09)
9
80
 
10
81
 
package/MIGRATION.md CHANGED
@@ -6,8 +6,8 @@ Version `1.0.0` is the initial public baseline for this repository. There are no
6
6
 
7
7
  When upgrading within `1.x`, preserve these compatibility expectations:
8
8
 
9
- - Node.js must satisfy `^22.22.2 || ^24.15.0`.
10
- - pnpm must satisfy `^11.0.9`.
9
+ - Node.js must satisfy `>=22.22.2` (Node 24 and 26 are tested in CI).
10
+ - pnpm must satisfy `^11.28.10` for current development and build tooling.
11
11
  - Existing stdio MCP client configs can continue to launch `ssh-mcp-pro` with no arguments.
12
12
  - HTTP deployments should keep explicit authentication, allowed origins, host allowlists, strict host-key verification, and a remote-safe tool profile.
13
13
 
package/README.md CHANGED
@@ -1,17 +1,36 @@
1
1
  <h1 align="center">ssh-mcp-pro</h1>
2
2
 
3
+ <p align="center"><strong>Policy-controlled SSH automation for MCP clients</strong></p>
4
+
5
+ <p align="center">
6
+ <a href="INSTALL.md">Installation</a> ·
7
+ <a href="#quickstart">Quickstart</a> ·
8
+ <a href="https://oaslananka.github.io/ssh-mcp-pro/">API Docs</a> ·
9
+ <a href="https://deepwiki.com/oaslananka/ssh-mcp-pro">DeepWiki</a>
10
+ </p>
11
+
3
12
  <p align="center">
4
- <a href="https://www.npmjs.com/package/ssh-mcp-pro"><img alt="npm version" src="https://img.shields.io/npm/v/ssh-mcp-pro.svg" /></a>
5
- <a href="https://www.npmjs.com/package/ssh-mcp-pro"><img alt="npm downloads" src="https://img.shields.io/npm/dt/ssh-mcp-pro.svg" /></a>
6
- <a href="LICENSE"><img alt="license" src="https://img.shields.io/badge/license-MIT-blue.svg" /></a>
7
- <a href="https://github.com/oaslananka/ssh-mcp-pro/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/oaslananka/ssh-mcp-pro/actions/workflows/ci.yml/badge.svg" /></a>
8
- <a href="https://oaslananka.github.io/ssh-mcp-pro/"><img alt="API Docs" src="https://github.com/oaslananka/ssh-mcp-pro/actions/workflows/docs.yml/badge.svg" /></a>
13
+ <a href="https://www.npmjs.com/package/ssh-mcp-pro"><img alt="npm published version" src="https://img.shields.io/npm/v/ssh-mcp-pro?style=flat&amp;logo=npm" /></a>
14
+ <a href="https://github.com/oaslananka/ssh-mcp-pro/releases/latest"><img alt="GitHub release version" src="https://img.shields.io/github/v/release/oaslananka/ssh-mcp-pro?style=flat&amp;label=GitHub%20Release" /></a>
15
+ <a href="#prerequisites"><img alt="Node.js supported major versions: 22, 24, 26" src="https://img.shields.io/badge/Node.js-22%20%7C%2024%20%7C%2026-43853d?style=flat&amp;logo=nodedotjs&amp;logoColor=white" /></a>
16
+ <a href="LICENSE"><img alt="MIT license" src="https://img.shields.io/badge/License-MIT-ffcf33?style=flat" /></a>
17
+ <a href="https://oaslananka.github.io/ssh-mcp-pro/"><img alt="API documentation" src="https://img.shields.io/badge/Docs-API-2980b9?style=flat" /></a>
9
18
  </p>
10
19
 
11
20
  <p align="center">
12
- <a href="https://www.buymeacoffee.com/oaslananka">
13
- <img src="https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20coffee&emoji=%E2%98%95&slug=oaslananka&button_colour=FFDD00&font_colour=000000&font_family=Arial&outline_colour=000000&coffee_colour=ffffff" alt="Buy me a coffee" />
14
- </a>
21
+ <a href="https://github.com/oaslananka/ssh-mcp-pro/actions/workflows/ci.yml"><img alt="Main CI workflow status" src="https://github.com/oaslananka/ssh-mcp-pro/actions/workflows/ci.yml/badge.svg?branch=main" /></a>
22
+ <a href="https://github.com/oaslananka/ssh-mcp-pro/actions/workflows/codeql.yml"><img alt="CodeQL analysis workflow status" src="https://github.com/oaslananka/ssh-mcp-pro/actions/workflows/codeql.yml/badge.svg?branch=main" /></a>
23
+ </p>
24
+
25
+ <p align="center">
26
+ <a href="https://www.npmjs.com/package/ssh-mcp-pro"><img alt="All-time npm downloads (not unique users)" src="https://img.shields.io/npm/dt/ssh-mcp-pro?style=flat&amp;label=npm%20downloads" /></a>
27
+ <a href="https://gitgem.org/github/oaslananka/ssh-mcp-pro"><img alt="GitGem project listing" src="https://gitgem.org/api/badge/github/oaslananka/ssh-mcp-pro.svg" /></a>
28
+ </p>
29
+
30
+ <p align="center">
31
+ <a href="https://github.com/sponsors/oaslananka"><img alt="Sponsor through GitHub Sponsors" src="https://img.shields.io/badge/GitHub-Sponsors-ea4aaa?style=flat&amp;logo=githubsponsors" /></a>
32
+ <a href="https://www.buymeacoffee.com/oaslananka"><img alt="Support through Buy Me a Coffee" src="https://img.shields.io/badge/Buy%20Me%20a%20Coffee-Support-ffdd00?style=flat&amp;logo=buymeacoffee&amp;logoColor=000000" /></a>
33
+ <a href="https://github.com/oaslananka/ssh-mcp-pro"><img alt="Stars: live GitHub repository star count; visit repository to star" src="https://img.shields.io/github/stars/oaslananka/ssh-mcp-pro?style=flat&amp;label=Stars&amp;color=8e65d3" /></a>
15
34
  </p>
16
35
 
17
36
  ssh-mcp-pro is a secure Model Context Protocol (MCP) server for SSH automation. It lets MCP-capable clients open SSH sessions, inspect hosts, run guarded commands, manage files, transfer artifacts, create tunnels, and perform idempotent package or service work through policy-controlled tools.
@@ -19,12 +38,14 @@ ssh-mcp-pro is a secure Model Context Protocol (MCP) server for SSH automation.
19
38
  ## Prerequisites
20
39
 
21
40
  - Node.js `>=22.22.2` or `>=24.15.0` or `>=26.3.0`
22
- - pnpm `>=11.0.9`
41
+ - pnpm `^11.28.10` (use Corepack for development)
23
42
  - SSH access to the target hosts
24
43
  - Docker, only for local integration tests and container image builds
25
44
 
26
45
  ## Installation
27
46
 
47
+ For Windows/Linux outbound agent connection status, rotating diagnostics and a live PowerShell log view, see [Agent Activity Monitor](docs/agent-activity-monitor.md).
48
+
28
49
  Install globally with pnpm:
29
50
 
30
51
  ```bash
@@ -47,7 +68,7 @@ pnpm dlx ssh-mcp-pro
47
68
  Container images are published to GitHub Container Registry for release tags:
48
69
 
49
70
  ```bash
50
- docker run --rm ghcr.io/oaslananka/ssh-mcp-pro:1.0.0 --version
71
+ docker run --rm ghcr.io/oaslananka/ssh-mcp-pro:1.4.1 --version
51
72
  ```
52
73
 
53
74
  Images are published for `linux/amd64` and `linux/arm64` with exact semver and
@@ -67,11 +88,11 @@ Generic stdio MCP config:
67
88
  }
68
89
  ```
69
90
 
70
- VS Code settings style:
91
+ VS Code workspace `.vscode/mcp.json` configuration:
71
92
 
72
93
  ```json
73
94
  {
74
- "mcp.servers": {
95
+ "servers": {
75
96
  "ssh-mcp-pro": {
76
97
  "type": "stdio",
77
98
  "command": "ssh-mcp-pro",
@@ -219,7 +240,7 @@ ssh-mcp-pro starts with strict SSH host-key verification, denies root login, den
219
240
  task (tutorial, how-to, reference, explanation).
220
241
  - [docs/troubleshooting.md](docs/troubleshooting.md) covers common failure modes.
221
242
 
222
- ## Project Health & Governance
243
+ ## Project Health &amp; Governance
223
244
 
224
245
  - [GOVERNANCE.md](GOVERNANCE.md) describes how decisions are made today.
225
246
  - [MAINTAINERS.md](MAINTAINERS.md) lists current maintainers.
@@ -80,6 +80,25 @@ The flow is intentional:
80
80
 
81
81
  These findings are dismissed individually with a false-positive rationale. No broad CodeQL suppression is used.
82
82
 
83
+ ### CodeQL #156: required signed agent hello
84
+
85
+ CodeQL alert #156 (`js/file-access-to-http`) traces the locally stored agent
86
+ configuration through the signed `agent.hello` WebSocket send. This is
87
+ **intentional authenticated protocol traffic**, not an arbitrary upload of
88
+ the configuration file. The message contains the agent ID, capability names,
89
+ version, host metadata, nonce, timestamp, and Ed25519 signature. It does
90
+ **not** include the saved private key or enrollment token.
91
+
92
+ As defense in depth, enrollment and subsequent agent startup now check that
93
+ the WebSocket destination has the **same host and port** as the explicitly
94
+ enrolled HTTP(S) server, uses the matching WS(S) transport without a downgrade,
95
+ and contains no URL credentials, query, or fragment. Configured custom
96
+ WebSocket paths still work. Mismatched enrollment responses are rejected
97
+ without saving a config; modified saved destinations are rejected before
98
+ connecting. Do not suppress this rule globally or weaken legitimate signed
99
+ hello delivery to silence taint analysis.
100
+
101
+
83
102
  ## Other CodeQL False-Positive Dispositions
84
103
 
85
104
  - **`js/file-access-to-http` in `scripts/check-dependency-freshness.mjs` (`fetchJson`)**: annotated in-code with `codeql[js/file-access-to-http]`. Every URL reaching `fetch()` is either a hardcoded constant or built by `registryPackageUrl()`, which validates the package name against `assertNpmPackageName()` before use; names originate from this repository's own `package.json`, not external input.
package/dist/agent-bin.js CHANGED
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { runAgentCli } from "./remote/agent-cli.js";
3
- runAgentCli(process.argv.slice(2)).catch((error) => {
3
+ try {
4
+ await runAgentCli(process.argv.slice(2));
5
+ }
6
+ catch (error) {
4
7
  const message = error instanceof Error ? error.message : String(error);
5
8
  process.stderr.write(`${message}\n`);
6
9
  process.exit(1);
7
- });
10
+ }
8
11
  //# sourceMappingURL=agent-bin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-bin.js","sourceRoot":"","sources":["../src/agent-bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC1D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"agent-bin.js","sourceRoot":"","sources":["../src/agent-bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,IAAI,CAAC;IACH,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAAC,OAAO,KAAc,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
package/dist/cli.d.ts CHANGED
@@ -13,4 +13,5 @@ export interface CliOptions {
13
13
  agentArgs?: string[];
14
14
  }
15
15
  export declare function parseArgs(argv: string[]): CliOptions;
16
+ export declare function applyHttpCliEnvironment(opts: CliOptions, env?: NodeJS.ProcessEnv): void;
16
17
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmGpD"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAaD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA8DpD;AAGD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,IAAI,CAmBN"}
package/dist/cli.js CHANGED
@@ -1,3 +1,10 @@
1
+ const VALUE_OPTIONS = new Map([
2
+ ["--host", "host"],
3
+ ["--port", "port"],
4
+ ["--bearer-token-file", "bearerTokenFile"],
5
+ ["--tool-profile", "toolProfile"],
6
+ ["--connector-credential-provider", "connectorCredentialProvider"],
7
+ ]);
1
8
  export function parseArgs(argv) {
2
9
  const opts = {
3
10
  help: false,
@@ -9,11 +16,19 @@ export function parseArgs(argv) {
9
16
  };
10
17
  for (let index = 0; index < argv.length; index++) {
11
18
  const arg = argv[index];
19
+ const valueOption = VALUE_OPTIONS.get(arg ?? "");
20
+ if (valueOption) {
21
+ const next = argv[index + 1];
22
+ if (next !== undefined) {
23
+ opts[valueOption] = next;
24
+ index++;
25
+ }
26
+ continue;
27
+ }
12
28
  switch (arg) {
13
29
  case "agent":
14
30
  opts.agentArgs = argv.slice(index + 1);
15
- index = argv.length;
16
- break;
31
+ return opts;
17
32
  case "http":
18
33
  opts.transport = "http";
19
34
  break;
@@ -38,54 +53,9 @@ export function parseArgs(argv) {
38
53
  case "--transport=stdio":
39
54
  opts.transport = "stdio";
40
55
  break;
41
- case "--host":
42
- {
43
- const next = argv[index + 1];
44
- if (next !== undefined) {
45
- opts.host = next;
46
- index++;
47
- }
48
- }
49
- break;
50
- case "--port":
51
- {
52
- const next = argv[index + 1];
53
- if (next !== undefined) {
54
- opts.port = next;
55
- index++;
56
- }
57
- }
58
- break;
59
- case "--bearer-token-file":
60
- {
61
- const next = argv[index + 1];
62
- if (next !== undefined) {
63
- opts.bearerTokenFile = next;
64
- index++;
65
- }
66
- }
67
- break;
68
56
  case "--enable-legacy-sse":
69
57
  opts.enableLegacySse = true;
70
58
  break;
71
- case "--tool-profile":
72
- {
73
- const next = argv[index + 1];
74
- if (next !== undefined) {
75
- opts.toolProfile = next;
76
- index++;
77
- }
78
- }
79
- break;
80
- case "--connector-credential-provider":
81
- {
82
- const next = argv[index + 1];
83
- if (next !== undefined) {
84
- opts.connectorCredentialProvider = next;
85
- index++;
86
- }
87
- }
88
- break;
89
59
  case "--no-stdio":
90
60
  opts.unsupportedNoStdio = true;
91
61
  break;
@@ -96,4 +66,25 @@ export function parseArgs(argv) {
96
66
  }
97
67
  return opts;
98
68
  }
69
+ // Apply HTTP CLI overrides without changing values omitted by the caller.
70
+ export function applyHttpCliEnvironment(opts, env = process.env) {
71
+ if (opts.host) {
72
+ env.SSH_MCP_HTTP_HOST = opts.host;
73
+ }
74
+ if (opts.port) {
75
+ env.SSH_MCP_HTTP_PORT = opts.port;
76
+ }
77
+ if (opts.bearerTokenFile) {
78
+ env.SSH_MCP_HTTP_BEARER_TOKEN_FILE = opts.bearerTokenFile;
79
+ }
80
+ if (opts.enableLegacySse) {
81
+ env.SSH_MCP_ENABLE_LEGACY_SSE = "true";
82
+ }
83
+ if (opts.toolProfile) {
84
+ env.SSH_MCP_TOOL_PROFILE = opts.toolProfile;
85
+ }
86
+ if (opts.connectorCredentialProvider) {
87
+ env.SSH_MCP_CONNECTOR_CREDENTIAL_PROVIDER = opts.connectorCredentialProvider;
88
+ }
89
+ }
99
90
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ServerConfig } from "./config-types.js";
2
+ /** Apply security and policy environment values before programmatic overrides. */
3
+ export declare function applySecurityPolicyEnvironment(config: ServerConfig): void;
4
+ //# sourceMappingURL=config-security-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-security-env.d.ts","sourceRoot":"","sources":["../src/config-security-env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAiGtD,kFAAkF;AAClF,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CA4BzE"}
@@ -0,0 +1,64 @@
1
+ import { loadPolicyFile, parseBoolean, parseHostKeyPolicy, parseList } from "./config-parsers.js";
2
+ /** Prefer non-empty environment lists, otherwise retain file/default policy lists. */
3
+ function resolvePolicyList(value, fallback) {
4
+ const parsed = parseList(value);
5
+ return parsed.length ? parsed : fallback;
6
+ }
7
+ /** Keep ordinary allow/deny path and host lists independent from tunnel policy. */
8
+ function resolveGeneralPolicyLists(config, filePolicy) {
9
+ return {
10
+ allowedHosts: resolvePolicyList(process.env.SSH_MCP_ALLOWED_HOSTS, filePolicy.allowedHosts ?? config.policy.allowedHosts),
11
+ commandAllow: resolvePolicyList(process.env.SSH_MCP_COMMAND_ALLOW, filePolicy.commandAllow ?? config.policy.commandAllow),
12
+ commandDeny: resolvePolicyList(process.env.SSH_MCP_COMMAND_DENY, filePolicy.commandDeny ?? config.policy.commandDeny),
13
+ pathAllowPrefixes: resolvePolicyList(process.env.SSH_MCP_PATH_ALLOW_PREFIXES, filePolicy.pathAllowPrefixes ?? config.policy.pathAllowPrefixes),
14
+ pathDenyPrefixes: resolvePolicyList(process.env.SSH_MCP_PATH_DENY_PREFIXES, filePolicy.pathDenyPrefixes ?? config.policy.pathDenyPrefixes),
15
+ localPathAllowPrefixes: resolvePolicyList(process.env.SSH_MCP_LOCAL_PATH_ALLOW_PREFIXES, filePolicy.localPathAllowPrefixes ?? config.policy.localPathAllowPrefixes),
16
+ localPathDenyPrefixes: resolvePolicyList(process.env.SSH_MCP_LOCAL_PATH_DENY_PREFIXES, filePolicy.localPathDenyPrefixes ?? config.policy.localPathDenyPrefixes),
17
+ };
18
+ }
19
+ function resolveTunnelPolicyLists(config, filePolicy) {
20
+ return {
21
+ tunnelAllowBindHosts: resolvePolicyList(process.env.SSH_MCP_TUNNEL_ALLOW_BIND_HOSTS, filePolicy.tunnelAllowBindHosts ?? config.policy.tunnelAllowBindHosts),
22
+ tunnelDenyBindHosts: resolvePolicyList(process.env.SSH_MCP_TUNNEL_DENY_BIND_HOSTS, filePolicy.tunnelDenyBindHosts ?? config.policy.tunnelDenyBindHosts),
23
+ tunnelAllowRemoteHosts: resolvePolicyList(process.env.SSH_MCP_TUNNEL_ALLOW_REMOTE_HOSTS, filePolicy.tunnelAllowRemoteHosts ?? config.policy.tunnelAllowRemoteHosts),
24
+ tunnelDenyRemoteHosts: resolvePolicyList(process.env.SSH_MCP_TUNNEL_DENY_REMOTE_HOSTS, filePolicy.tunnelDenyRemoteHosts ?? config.policy.tunnelDenyRemoteHosts),
25
+ tunnelAllowPorts: resolvePolicyList(process.env.SSH_MCP_TUNNEL_ALLOW_PORTS, filePolicy.tunnelAllowPorts ?? config.policy.tunnelAllowPorts),
26
+ tunnelDenyPorts: resolvePolicyList(process.env.SSH_MCP_TUNNEL_DENY_PORTS, filePolicy.tunnelDenyPorts ?? config.policy.tunnelDenyPorts),
27
+ };
28
+ }
29
+ /** Preserve host-key migration precedence and root-login policy coupling. */
30
+ function applyHostKeyEnvironment(config) {
31
+ const strictHostKeyChecking = process.env.STRICT_HOST_KEY_CHECKING ?? process.env.SSH_MCP_STRICT_HOST_KEY;
32
+ if (strictHostKeyChecking !== undefined) {
33
+ config.security.hostKeyPolicy = parseBoolean(strictHostKeyChecking, true)
34
+ ? "strict"
35
+ : "insecure";
36
+ }
37
+ config.security.hostKeyPolicy = parseHostKeyPolicy(process.env.SSH_MCP_HOST_KEY_POLICY, config.security.hostKeyPolicy);
38
+ config.security.knownHostsPath =
39
+ process.env.KNOWN_HOSTS_PATH ??
40
+ process.env.SSH_MCP_KNOWN_HOSTS_PATH ??
41
+ config.security.knownHostsPath;
42
+ config.security.allowRootLogin = parseBoolean(process.env.SSH_MCP_ALLOW_ROOT_LOGIN, config.security.allowRootLogin);
43
+ config.security.allowedCiphers = parseList(process.env.SSH_MCP_ALLOWED_CIPHERS);
44
+ }
45
+ /** Apply security and policy environment values before programmatic overrides. */
46
+ export function applySecurityPolicyEnvironment(config) {
47
+ applyHostKeyEnvironment(config);
48
+ const filePolicy = loadPolicyFile(process.env.SSH_MCP_POLICY_FILE);
49
+ config.policy = {
50
+ ...config.policy,
51
+ ...filePolicy,
52
+ mode: process.env.SSH_MCP_POLICY_MODE === "explain"
53
+ ? "explain"
54
+ : (filePolicy.mode ?? config.policy.mode),
55
+ allowRootLogin: config.security.allowRootLogin,
56
+ allowRawSudo: parseBoolean(process.env.SSH_MCP_ALLOW_RAW_SUDO, filePolicy.allowRawSudo ?? config.policy.allowRawSudo),
57
+ allowDestructiveCommands: parseBoolean(process.env.SSH_MCP_ALLOW_DESTRUCTIVE_COMMANDS, filePolicy.allowDestructiveCommands ?? config.policy.allowDestructiveCommands),
58
+ allowDestructiveFs: parseBoolean(process.env.SSH_MCP_ALLOW_DESTRUCTIVE_FS, filePolicy.allowDestructiveFs ?? config.policy.allowDestructiveFs),
59
+ ...resolveGeneralPolicyLists(config, filePolicy),
60
+ ...resolveTunnelPolicyLists(config, filePolicy),
61
+ };
62
+ config.policy.allowRootLogin = config.security.allowRootLogin;
63
+ }
64
+ //# sourceMappingURL=config-security-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-security-env.js","sourceRoot":"","sources":["../src/config-security-env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { ConnectorCredentialProvider } from "./config-parsers.js";
2
+ import type { ToolProfile } from "./connector-profile.js";
3
+ import type { PolicyConfig } from "./policy.js";
4
+ import type { HostKeyPolicy } from "./types.js";
5
+ /**
6
+ * Server configuration options
7
+ */
8
+ export interface ServerConfig {
9
+ /** Maximum concurrent sessions */
10
+ maxSessions: number;
11
+ /** Default session TTL in milliseconds */
12
+ sessionTtlMs: number;
13
+ /** Session cleanup interval in milliseconds */
14
+ cleanupIntervalMs: number;
15
+ /** Default command timeout in milliseconds */
16
+ commandTimeoutMs: number;
17
+ /** Maximum buffered stdout/stderr per command result (bytes) */
18
+ maxCommandOutputBytes: number;
19
+ /** Maximum streaming chunks retained in memory */
20
+ maxStreamChunks: number;
21
+ /** Maximum file size for read operations (bytes) */
22
+ maxFileSize: number;
23
+ /** Maximum file write payload size accepted before buffering (bytes) */
24
+ maxFileWriteBytes: number;
25
+ /** Maximum file transfer size (bytes) */
26
+ maxTransferBytes: number;
27
+ /** Enable debug logging */
28
+ debug: boolean;
29
+ /** Rate limiting configuration */
30
+ rateLimit: {
31
+ enabled: boolean;
32
+ maxRequests: number;
33
+ windowMs: number;
34
+ perSession: {
35
+ enabled: boolean;
36
+ maxRequests: number;
37
+ windowMs: number;
38
+ };
39
+ };
40
+ /** Security settings */
41
+ security: {
42
+ allowRootLogin: boolean;
43
+ hostKeyPolicy: HostKeyPolicy;
44
+ knownHostsPath: string;
45
+ allowedCiphers: string[];
46
+ };
47
+ /** Policy settings enforced before risky operations */
48
+ policy: PolicyConfig;
49
+ /** Remote HTTP transport settings */
50
+ http: {
51
+ host: string;
52
+ port: number;
53
+ allowedOrigins: string[];
54
+ bearerTokenFile?: string;
55
+ enableLegacySse: boolean;
56
+ maxRequestBodyBytes: number;
57
+ maxSessions: number;
58
+ sessionIdleTtlMs: number;
59
+ publicUrl?: string;
60
+ trustProxy: boolean;
61
+ };
62
+ /** Remote ChatGPT/Claude connector settings */
63
+ connector: {
64
+ toolProfile: ToolProfile;
65
+ credentialProvider: ConnectorCredentialProvider;
66
+ credentialCommand?: string;
67
+ credentialCommandArgs: string[];
68
+ credentialCommandTimeoutMs: number;
69
+ defaultUsername?: string;
70
+ };
71
+ /** HTTP authorization settings for remote MCP clients */
72
+ auth: {
73
+ mode: "bearer" | "oauth";
74
+ oauthIssuer?: string;
75
+ oauthAudience?: string;
76
+ oauthJwksUrl?: string;
77
+ oauthResource?: string;
78
+ oauthRequiredScopes: string[];
79
+ oauthAllowedAlgorithms: string[];
80
+ };
81
+ }
82
+ //# sourceMappingURL=config-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-types.d.ts","sourceRoot":"","sources":["../src/config-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,kCAAkC;IAClC,SAAS,EAAE;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE;YACV,OAAO,EAAE,OAAO,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;KACH,CAAC;IACF,wBAAwB;IACxB,QAAQ,EAAE;QACR,cAAc,EAAE,OAAO,CAAC;QACxB,aAAa,EAAE,aAAa,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,uDAAuD;IACvD,MAAM,EAAE,YAAY,CAAC;IACrB,qCAAqC;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,OAAO,CAAC;QACzB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,+CAA+C;IAC/C,SAAS,EAAE;QACT,WAAW,EAAE,WAAW,CAAC;QACzB,kBAAkB,EAAE,2BAA2B,CAAC;QAChD,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,qBAAqB,EAAE,MAAM,EAAE,CAAC;QAChC,0BAA0B,EAAE,MAAM,CAAC;QACnC,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,yDAAyD;IACzD,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,sBAAsB,EAAE,MAAM,EAAE,CAAC;KAClC,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-types.js","sourceRoot":"","sources":["../src/config-types.ts"],"names":[],"mappings":""}