ssh-mcp-pro 1.0.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 (267) hide show
  1. package/AGENTS.md +127 -0
  2. package/ARCHITECTURE.md +145 -0
  3. package/LICENSE +21 -0
  4. package/LICENSES/MIT.txt +21 -0
  5. package/MIGRATION.md +14 -0
  6. package/README.md +175 -0
  7. package/REGISTRY_SUBMISSION.md +38 -0
  8. package/SECURITY.md +40 -0
  9. package/SECURITY_DECISIONS.md +59 -0
  10. package/dist/agent-bin.d.ts +3 -0
  11. package/dist/agent-bin.d.ts.map +1 -0
  12. package/dist/agent-bin.js +8 -0
  13. package/dist/agent-bin.js.map +1 -0
  14. package/dist/audit.d.ts +25 -0
  15. package/dist/audit.d.ts.map +1 -0
  16. package/dist/audit.js +50 -0
  17. package/dist/audit.js.map +1 -0
  18. package/dist/auth.d.ts +4 -0
  19. package/dist/auth.d.ts.map +1 -0
  20. package/dist/auth.js +33 -0
  21. package/dist/auth.js.map +1 -0
  22. package/dist/cli.d.ts +16 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +99 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/config.d.ts +103 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +490 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/connector-credentials.d.ts +8 -0
  31. package/dist/connector-credentials.d.ts.map +1 -0
  32. package/dist/connector-credentials.js +132 -0
  33. package/dist/connector-credentials.js.map +1 -0
  34. package/dist/connector-profile.d.ts +17 -0
  35. package/dist/connector-profile.d.ts.map +1 -0
  36. package/dist/connector-profile.js +81 -0
  37. package/dist/connector-profile.js.map +1 -0
  38. package/dist/container.d.ts +18 -0
  39. package/dist/container.d.ts.map +1 -0
  40. package/dist/container.js +52 -0
  41. package/dist/container.js.map +1 -0
  42. package/dist/detect.d.ts +7 -0
  43. package/dist/detect.d.ts.map +1 -0
  44. package/dist/detect.js +271 -0
  45. package/dist/detect.js.map +1 -0
  46. package/dist/ensure.d.ts +17 -0
  47. package/dist/ensure.d.ts.map +1 -0
  48. package/dist/ensure.js +531 -0
  49. package/dist/ensure.js.map +1 -0
  50. package/dist/errors.d.ts +54 -0
  51. package/dist/errors.d.ts.map +1 -0
  52. package/dist/errors.js +84 -0
  53. package/dist/errors.js.map +1 -0
  54. package/dist/fs-tools.d.ts +26 -0
  55. package/dist/fs-tools.d.ts.map +1 -0
  56. package/dist/fs-tools.js +599 -0
  57. package/dist/fs-tools.js.map +1 -0
  58. package/dist/http-rate-limit.d.ts +9 -0
  59. package/dist/http-rate-limit.d.ts.map +1 -0
  60. package/dist/http-rate-limit.js +41 -0
  61. package/dist/http-rate-limit.js.map +1 -0
  62. package/dist/http-security.d.ts +22 -0
  63. package/dist/http-security.d.ts.map +1 -0
  64. package/dist/http-security.js +88 -0
  65. package/dist/http-security.js.map +1 -0
  66. package/dist/index.d.ts +10 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +201 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/logging.d.ts +52 -0
  71. package/dist/logging.d.ts.map +1 -0
  72. package/dist/logging.js +180 -0
  73. package/dist/logging.js.map +1 -0
  74. package/dist/mcp.d.ts +16 -0
  75. package/dist/mcp.d.ts.map +1 -0
  76. package/dist/mcp.js +159 -0
  77. package/dist/mcp.js.map +1 -0
  78. package/dist/metrics.d.ts +95 -0
  79. package/dist/metrics.d.ts.map +1 -0
  80. package/dist/metrics.js +204 -0
  81. package/dist/metrics.js.map +1 -0
  82. package/dist/oauth.d.ts +14 -0
  83. package/dist/oauth.d.ts.map +1 -0
  84. package/dist/oauth.js +105 -0
  85. package/dist/oauth.js.map +1 -0
  86. package/dist/policy.d.ts +64 -0
  87. package/dist/policy.d.ts.map +1 -0
  88. package/dist/policy.js +368 -0
  89. package/dist/policy.js.map +1 -0
  90. package/dist/process.d.ts +24 -0
  91. package/dist/process.d.ts.map +1 -0
  92. package/dist/process.js +212 -0
  93. package/dist/process.js.map +1 -0
  94. package/dist/prompts.d.ts +49 -0
  95. package/dist/prompts.d.ts.map +1 -0
  96. package/dist/prompts.js +191 -0
  97. package/dist/prompts.js.map +1 -0
  98. package/dist/rate-limiter.d.ts +57 -0
  99. package/dist/rate-limiter.d.ts.map +1 -0
  100. package/dist/rate-limiter.js +141 -0
  101. package/dist/rate-limiter.js.map +1 -0
  102. package/dist/remote/agent-cli.d.ts +2 -0
  103. package/dist/remote/agent-cli.d.ts.map +1 -0
  104. package/dist/remote/agent-cli.js +270 -0
  105. package/dist/remote/agent-cli.js.map +1 -0
  106. package/dist/remote/agent-executor.d.ts +26 -0
  107. package/dist/remote/agent-executor.d.ts.map +1 -0
  108. package/dist/remote/agent-executor.js +400 -0
  109. package/dist/remote/agent-executor.js.map +1 -0
  110. package/dist/remote/config.d.ts +3 -0
  111. package/dist/remote/config.d.ts.map +1 -0
  112. package/dist/remote/config.js +52 -0
  113. package/dist/remote/config.js.map +1 -0
  114. package/dist/remote/control-plane.d.ts +57 -0
  115. package/dist/remote/control-plane.d.ts.map +1 -0
  116. package/dist/remote/control-plane.js +1248 -0
  117. package/dist/remote/control-plane.js.map +1 -0
  118. package/dist/remote/crypto.d.ts +38 -0
  119. package/dist/remote/crypto.d.ts.map +1 -0
  120. package/dist/remote/crypto.js +143 -0
  121. package/dist/remote/crypto.js.map +1 -0
  122. package/dist/remote/mcp-tools.d.ts +10 -0
  123. package/dist/remote/mcp-tools.d.ts.map +1 -0
  124. package/dist/remote/mcp-tools.js +201 -0
  125. package/dist/remote/mcp-tools.js.map +1 -0
  126. package/dist/remote/policy.d.ts +11 -0
  127. package/dist/remote/policy.d.ts.map +1 -0
  128. package/dist/remote/policy.js +94 -0
  129. package/dist/remote/policy.js.map +1 -0
  130. package/dist/remote/schemas.d.ts +298 -0
  131. package/dist/remote/schemas.d.ts.map +1 -0
  132. package/dist/remote/schemas.js +111 -0
  133. package/dist/remote/schemas.js.map +1 -0
  134. package/dist/remote/scopes.d.ts +6 -0
  135. package/dist/remote/scopes.d.ts.map +1 -0
  136. package/dist/remote/scopes.js +24 -0
  137. package/dist/remote/scopes.js.map +1 -0
  138. package/dist/remote/store.d.ts +45 -0
  139. package/dist/remote/store.d.ts.map +1 -0
  140. package/dist/remote/store.js +355 -0
  141. package/dist/remote/store.js.map +1 -0
  142. package/dist/remote/types.d.ts +183 -0
  143. package/dist/remote/types.d.ts.map +1 -0
  144. package/dist/remote/types.js +103 -0
  145. package/dist/remote/types.js.map +1 -0
  146. package/dist/remote/util.d.ts +6 -0
  147. package/dist/remote/util.d.ts.map +1 -0
  148. package/dist/remote/util.js +45 -0
  149. package/dist/remote/util.js.map +1 -0
  150. package/dist/remote/websocket.d.ts +26 -0
  151. package/dist/remote/websocket.d.ts.map +1 -0
  152. package/dist/remote/websocket.js +167 -0
  153. package/dist/remote/websocket.js.map +1 -0
  154. package/dist/render-http.d.ts +2 -0
  155. package/dist/render-http.d.ts.map +1 -0
  156. package/dist/render-http.js +14 -0
  157. package/dist/render-http.js.map +1 -0
  158. package/dist/resources.d.ts +19 -0
  159. package/dist/resources.d.ts.map +1 -0
  160. package/dist/resources.js +96 -0
  161. package/dist/resources.js.map +1 -0
  162. package/dist/retry.d.ts +45 -0
  163. package/dist/retry.d.ts.map +1 -0
  164. package/dist/retry.js +120 -0
  165. package/dist/retry.js.map +1 -0
  166. package/dist/safety.d.ts +31 -0
  167. package/dist/safety.d.ts.map +1 -0
  168. package/dist/safety.js +174 -0
  169. package/dist/safety.js.map +1 -0
  170. package/dist/server-http.d.ts +2 -0
  171. package/dist/server-http.d.ts.map +1 -0
  172. package/dist/server-http.js +432 -0
  173. package/dist/server-http.js.map +1 -0
  174. package/dist/session.d.ts +116 -0
  175. package/dist/session.d.ts.map +1 -0
  176. package/dist/session.js +666 -0
  177. package/dist/session.js.map +1 -0
  178. package/dist/shell.d.ts +10 -0
  179. package/dist/shell.d.ts.map +1 -0
  180. package/dist/shell.js +83 -0
  181. package/dist/shell.js.map +1 -0
  182. package/dist/ssh-config.d.ts +94 -0
  183. package/dist/ssh-config.d.ts.map +1 -0
  184. package/dist/ssh-config.js +234 -0
  185. package/dist/ssh-config.js.map +1 -0
  186. package/dist/streaming.d.ts +36 -0
  187. package/dist/streaming.d.ts.map +1 -0
  188. package/dist/streaming.js +140 -0
  189. package/dist/streaming.js.map +1 -0
  190. package/dist/telemetry.d.ts +17 -0
  191. package/dist/telemetry.d.ts.map +1 -0
  192. package/dist/telemetry.js +101 -0
  193. package/dist/telemetry.js.map +1 -0
  194. package/dist/tools/connector.provider.d.ts +28 -0
  195. package/dist/tools/connector.provider.d.ts.map +1 -0
  196. package/dist/tools/connector.provider.js +360 -0
  197. package/dist/tools/connector.provider.js.map +1 -0
  198. package/dist/tools/ensure.provider.d.ts +18 -0
  199. package/dist/tools/ensure.provider.d.ts.map +1 -0
  200. package/dist/tools/ensure.provider.js +173 -0
  201. package/dist/tools/ensure.provider.js.map +1 -0
  202. package/dist/tools/fs.provider.d.ts +21 -0
  203. package/dist/tools/fs.provider.d.ts.map +1 -0
  204. package/dist/tools/fs.provider.js +259 -0
  205. package/dist/tools/fs.provider.js.map +1 -0
  206. package/dist/tools/index.d.ts +4 -0
  207. package/dist/tools/index.d.ts.map +1 -0
  208. package/dist/tools/index.js +68 -0
  209. package/dist/tools/index.js.map +1 -0
  210. package/dist/tools/metadata.d.ts +11 -0
  211. package/dist/tools/metadata.d.ts.map +1 -0
  212. package/dist/tools/metadata.js +10 -0
  213. package/dist/tools/metadata.js.map +1 -0
  214. package/dist/tools/output-schemas.d.ts +217 -0
  215. package/dist/tools/output-schemas.d.ts.map +1 -0
  216. package/dist/tools/output-schemas.js +300 -0
  217. package/dist/tools/output-schemas.js.map +1 -0
  218. package/dist/tools/process.provider.d.ts +22 -0
  219. package/dist/tools/process.provider.d.ts.map +1 -0
  220. package/dist/tools/process.provider.js +146 -0
  221. package/dist/tools/process.provider.js.map +1 -0
  222. package/dist/tools/registry.d.ts +12 -0
  223. package/dist/tools/registry.d.ts.map +1 -0
  224. package/dist/tools/registry.js +163 -0
  225. package/dist/tools/registry.js.map +1 -0
  226. package/dist/tools/results.d.ts +4 -0
  227. package/dist/tools/results.d.ts.map +1 -0
  228. package/dist/tools/results.js +5 -0
  229. package/dist/tools/results.js.map +1 -0
  230. package/dist/tools/session.provider.d.ts +23 -0
  231. package/dist/tools/session.provider.d.ts.map +1 -0
  232. package/dist/tools/session.provider.js +299 -0
  233. package/dist/tools/session.provider.js.map +1 -0
  234. package/dist/tools/system.provider.d.ts +18 -0
  235. package/dist/tools/system.provider.d.ts.map +1 -0
  236. package/dist/tools/system.provider.js +81 -0
  237. package/dist/tools/system.provider.js.map +1 -0
  238. package/dist/tools/transfer.provider.d.ts +16 -0
  239. package/dist/tools/transfer.provider.d.ts.map +1 -0
  240. package/dist/tools/transfer.provider.js +85 -0
  241. package/dist/tools/transfer.provider.js.map +1 -0
  242. package/dist/tools/tunnel.provider.d.ts +18 -0
  243. package/dist/tools/tunnel.provider.d.ts.map +1 -0
  244. package/dist/tools/tunnel.provider.js +142 -0
  245. package/dist/tools/tunnel.provider.js.map +1 -0
  246. package/dist/tools/types.d.ts +16 -0
  247. package/dist/tools/types.d.ts.map +1 -0
  248. package/dist/tools/types.js +2 -0
  249. package/dist/tools/types.js.map +1 -0
  250. package/dist/transfer.d.ts +40 -0
  251. package/dist/transfer.d.ts.map +1 -0
  252. package/dist/transfer.js +363 -0
  253. package/dist/transfer.js.map +1 -0
  254. package/dist/tunnel.d.ts +37 -0
  255. package/dist/tunnel.d.ts.map +1 -0
  256. package/dist/tunnel.js +234 -0
  257. package/dist/tunnel.js.map +1 -0
  258. package/dist/types.d.ts +341 -0
  259. package/dist/types.d.ts.map +1 -0
  260. package/dist/types.js +184 -0
  261. package/dist/types.js.map +1 -0
  262. package/docs/docker.md +22 -0
  263. package/examples/README.md +77 -0
  264. package/mcp.json +21 -0
  265. package/package.json +147 -0
  266. package/registry/ssh-mcp-pro/mcp.json +21 -0
  267. package/server.json +76 -0
@@ -0,0 +1,41 @@
1
+ const rateLimitHeaderNames = {
2
+ limit: "X-RateLimit-Limit",
3
+ remaining: "X-RateLimit-Remaining",
4
+ reset: "X-RateLimit-Reset",
5
+ };
6
+ export function buildRateLimitHeaders(rateLimiter, rateLimit, key = "global", now = Date.now()) {
7
+ if (!rateLimit.enabled) {
8
+ return {};
9
+ }
10
+ const usage = rateLimiter.getUsage(key, {
11
+ maxRequests: rateLimit.maxRequests,
12
+ windowMs: rateLimit.windowMs,
13
+ });
14
+ const resetIn = Math.max(0, usage?.resetIn ?? rateLimit.windowMs);
15
+ return {
16
+ [rateLimitHeaderNames.limit]: String(rateLimit.maxRequests),
17
+ [rateLimitHeaderNames.remaining]: String(usage?.remaining ?? rateLimit.maxRequests),
18
+ [rateLimitHeaderNames.reset]: String(Math.ceil((now + resetIn) / 1000)),
19
+ };
20
+ }
21
+ export function attachRateLimitHeaders(res, buildHeaders) {
22
+ const originalWriteHead = res.writeHead;
23
+ const originalEnd = res.end;
24
+ const applyHeaders = () => {
25
+ if (res.headersSent) {
26
+ return;
27
+ }
28
+ for (const [name, value] of Object.entries(buildHeaders())) {
29
+ res.setHeader(name, value);
30
+ }
31
+ };
32
+ res.writeHead = function writeHeadWithRateLimitHeaders(...args) {
33
+ applyHeaders();
34
+ return Reflect.apply(originalWriteHead, this, args);
35
+ };
36
+ res.end = function endWithRateLimitHeaders(...args) {
37
+ applyHeaders();
38
+ return Reflect.apply(originalEnd, this, args);
39
+ };
40
+ }
41
+ //# sourceMappingURL=http-rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-rate-limit.js","sourceRoot":"","sources":["../src/http-rate-limit.ts"],"names":[],"mappings":"AAIA,MAAM,oBAAoB,GAAG;IAC3B,KAAK,EAAE,mBAAmB;IAC1B,SAAS,EAAE,uBAAuB;IAClC,KAAK,EAAE,mBAAmB;CAClB,CAAC;AAQX,MAAM,UAAU,qBAAqB,CACnC,WAAiC,EACjC,SAAkC,EAClC,GAAG,GAAG,QAAQ,EACd,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE;QACtC,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,QAAQ,EAAE,SAAS,CAAC,QAAQ;KAC7B,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;IAElE,OAAO;QACL,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;QAC3D,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,IAAI,SAAS,CAAC,WAAW,CAAC;QACnF,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,GAAmB,EACnB,YAA0C;IAE1C,MAAM,iBAAiB,GAAG,GAAG,CAAC,SAAS,CAAC;IACxC,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC;IAE5B,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,GAAG,CAAC,SAAS,GAAG,SAAS,6BAA6B,CAAuB,GAAG,IAAe;QAC7F,YAAY,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtD,CAAgC,CAAC;IAEjC,GAAG,CAAC,GAAG,GAAG,SAAS,uBAAuB,CAAuB,GAAG,IAAe;QACjF,YAAY,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,CAA0B,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type ToolProfile } from "./connector-profile.js";
2
+ import type { HostKeyPolicy } from "./types.js";
3
+ export interface HttpStartupConfig {
4
+ host: string;
5
+ allowedOrigins: string[];
6
+ bearerTokenFile?: string;
7
+ publicUrl?: string;
8
+ }
9
+ export interface HttpStartupSecurityContext {
10
+ toolProfile: ToolProfile;
11
+ allowedHosts: string[];
12
+ hostKeyPolicy?: HostKeyPolicy;
13
+ authMode?: "bearer" | "oauth";
14
+ oauthConfigured?: boolean;
15
+ }
16
+ export declare function isLoopbackHost(host: string): boolean;
17
+ export declare function validateHttpStartupConfig(httpConfig: HttpStartupConfig, bearerToken: string | undefined, context?: HttpStartupSecurityContext): void;
18
+ export declare function isOriginAllowed(origin: string | undefined, allowedOrigins: string[]): boolean;
19
+ export declare function corsHeaders(origin: string | undefined, allowedOrigins: string[]): Record<string, string>;
20
+ export declare function oauthProtectedResourceMetadataUrl(publicMcpUrl: string): string;
21
+ export declare function oauthWwwAuthenticateHeader(resourceMetadataUrl: string, scopes: readonly string[], includeErrorDetails?: boolean): string;
22
+ //# sourceMappingURL=http-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-security.d.ts","sourceRoot":"","sources":["../src/http-security.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASpD;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,EAC7B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,0BAMR,GACA,IAAI,CAuDN;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAE7F;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,cAAc,EAAE,MAAM,EAAE,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxB;AAED,wBAAgB,iCAAiC,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAQ9E;AAED,wBAAgB,0BAA0B,CACxC,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,mBAAmB,UAAQ,GAC1B,MAAM,CAUR"}
@@ -0,0 +1,88 @@
1
+ import { isRemoteSafeToolProfile } from "./connector-profile.js";
2
+ export function isLoopbackHost(host) {
3
+ const normalized = host.toLowerCase().replace(/^\[/u, "").replace(/\]$/u, "");
4
+ return (normalized === "localhost" ||
5
+ normalized.endsWith(".localhost") ||
6
+ normalized === "::1" ||
7
+ normalized === "0:0:0:0:0:0:0:1" ||
8
+ /^127(?:\.\d{1,3}){3}$/u.test(normalized));
9
+ }
10
+ export function validateHttpStartupConfig(httpConfig, bearerToken, context = {
11
+ toolProfile: "full",
12
+ allowedHosts: [],
13
+ hostKeyPolicy: "strict",
14
+ authMode: "bearer",
15
+ oauthConfigured: false,
16
+ }) {
17
+ if (httpConfig.bearerTokenFile && bearerToken?.length === 0) {
18
+ throw new Error("Refusing HTTP MCP startup with an empty bearer token file");
19
+ }
20
+ if (isLoopbackHost(httpConfig.host)) {
21
+ return;
22
+ }
23
+ const hasBearerAuth = Boolean(bearerToken);
24
+ const hasOAuthAuth = context.authMode === "oauth" && context.oauthConfigured === true;
25
+ if ((!hasBearerAuth && !hasOAuthAuth) || httpConfig.allowedOrigins.length === 0) {
26
+ throw new Error("Refusing non-loopback HTTP MCP binding without SSH_MCP_HTTP_BEARER_TOKEN_FILE or OAuth config, and SSH_MCP_HTTP_ALLOWED_ORIGINS");
27
+ }
28
+ if (!httpConfig.publicUrl) {
29
+ throw new Error("Refusing non-loopback HTTP MCP binding without SSH_MCP_HTTP_PUBLIC_URL for stable protected resource metadata");
30
+ }
31
+ try {
32
+ const publicUrl = new URL(httpConfig.publicUrl);
33
+ if (publicUrl.protocol !== "https:") {
34
+ throw new Error("public URL must use HTTPS");
35
+ }
36
+ if (isLoopbackHost(publicUrl.hostname)) {
37
+ throw new Error("public URL must not use a loopback host");
38
+ }
39
+ }
40
+ catch (error) {
41
+ throw new Error(`Refusing non-loopback HTTP MCP binding with invalid SSH_MCP_HTTP_PUBLIC_URL: ${error instanceof Error ? error.message : String(error)}`);
42
+ }
43
+ if (!isRemoteSafeToolProfile(context.toolProfile)) {
44
+ throw new Error("Refusing non-loopback HTTP MCP binding with full tool profile. Set SSH_MCP_TOOL_PROFILE=remote-safe, chatgpt, claude, remote-readonly, or remote-broker.");
45
+ }
46
+ if (context.allowedHosts.length === 0) {
47
+ throw new Error("Refusing non-loopback HTTP MCP binding without SSH_MCP_ALLOWED_HOSTS for remote connector profile");
48
+ }
49
+ if ((context.hostKeyPolicy ?? "strict") !== "strict") {
50
+ throw new Error("Refusing non-loopback HTTP MCP binding without strict SSH host-key verification");
51
+ }
52
+ }
53
+ export function isOriginAllowed(origin, allowedOrigins) {
54
+ return !origin || allowedOrigins.length === 0 || allowedOrigins.includes(origin);
55
+ }
56
+ export function corsHeaders(origin, allowedOrigins) {
57
+ if (!origin || !isOriginAllowed(origin, allowedOrigins)) {
58
+ return {};
59
+ }
60
+ return {
61
+ "Access-Control-Allow-Origin": origin,
62
+ "Access-Control-Allow-Headers": "authorization, content-type, mcp-session-id",
63
+ "Access-Control-Allow-Methods": "GET, POST, DELETE, OPTIONS",
64
+ "Access-Control-Expose-Headers": "mcp-session-id, WWW-Authenticate",
65
+ Vary: "Origin",
66
+ };
67
+ }
68
+ export function oauthProtectedResourceMetadataUrl(publicMcpUrl) {
69
+ const url = new URL(publicMcpUrl);
70
+ url.username = "";
71
+ url.password = "";
72
+ url.pathname = "/.well-known/oauth-protected-resource";
73
+ url.search = "";
74
+ url.hash = "";
75
+ return url.toString();
76
+ }
77
+ export function oauthWwwAuthenticateHeader(resourceMetadataUrl, scopes, includeErrorDetails = false) {
78
+ const parts = [`resource_metadata="${resourceMetadataUrl}"`];
79
+ if (scopes.length > 0) {
80
+ parts.push(`scope="${scopes.join(" ")}"`);
81
+ }
82
+ if (includeErrorDetails) {
83
+ parts.push('error="invalid_token"');
84
+ parts.push('error_description="A valid OAuth access token is required"');
85
+ }
86
+ return `Bearer ${parts.join(", ")}`;
87
+ }
88
+ //# sourceMappingURL=http-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-security.js","sourceRoot":"","sources":["../src/http-security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SSH MCP Server - Entry Point
4
+ *
5
+ * A Model Context Protocol (MCP) server that provides SSH automation tools
6
+ * for MCP-capable clients. Supports secure session management, remote command
7
+ * execution, file operations, transfers, tunnels, and system administration.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
package/dist/index.js ADDED
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SSH MCP Server - Entry Point
4
+ *
5
+ * A Model Context Protocol (MCP) server that provides SSH automation tools
6
+ * for MCP-capable clients. Supports secure session management, remote command
7
+ * execution, file operations, transfers, tunnels, and system administration.
8
+ */
9
+ import { readFileSync } from "fs";
10
+ import path from "path";
11
+ import { fileURLToPath } from "url";
12
+ import { parseArgs } from "./cli.js";
13
+ import { createContainer } from "./container.js";
14
+ import { SERVER_VERSION, SSHMCPServer } from "./mcp.js";
15
+ import { logger } from "./logging.js";
16
+ import { initTelemetry, shutdownTelemetry } from "./telemetry.js";
17
+ function getPackageInfo() {
18
+ try {
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = path.dirname(__filename);
21
+ const pkgPath = path.resolve(__dirname, "..", "package.json");
22
+ const raw = readFileSync(pkgPath, "utf8");
23
+ return JSON.parse(raw);
24
+ }
25
+ catch {
26
+ return {};
27
+ }
28
+ }
29
+ function printHelp() {
30
+ const pkg = getPackageInfo();
31
+ const name = pkg.name ?? "ssh-mcp-pro";
32
+ const version = pkg.version ? `v${pkg.version}` : "";
33
+ const help = [
34
+ `${name} ${version}`.trim(),
35
+ "",
36
+ "Usage:",
37
+ " ssh-mcp-pro Start MCP server over stdio (default)",
38
+ " ssh-mcp-pro stdio Start MCP server over stdio",
39
+ " ssh-mcp-pro http Start Streamable HTTP server",
40
+ " ssh-mcp-pro --transport=http Start Streamable HTTP server",
41
+ " ssh-mcp-pro-agent enroll --server <url> --token <token> --alias <alias>",
42
+ " ssh-mcp-pro-agent run Run the no-custody outbound agent",
43
+ " ssh-mcp-pro-agent status Show local agent enrollment status",
44
+ " ssh-mcp-pro --help Show this help",
45
+ " ssh-mcp-pro --version Show version",
46
+ " ssh-mcp-pro --stdio Force stdio mode (default)",
47
+ " ssh-mcp-pro --transport=http --host 127.0.0.1 --port 3000",
48
+ " ssh-mcp-pro --transport=http --bearer-token-file /path/token --enable-legacy-sse",
49
+ " ssh-mcp-pro --transport=http --tool-profile remote-safe",
50
+ " ssh-mcp-pro --transport=http --connector-credential-provider agent",
51
+ "",
52
+ "Examples:",
53
+ " Run as MCP stdio server: ssh-mcp-pro",
54
+ " Enroll remote agent: npx --yes --package ssh-mcp-pro@latest ssh-mcp-pro-agent enroll --server <url> --token <token> --alias <alias>",
55
+ " Run remote agent: npx --yes --package ssh-mcp-pro@latest ssh-mcp-pro-agent run",
56
+ " Claude/VS Code config snippet:",
57
+ ' { "servers": { "ssh-mcp": { "type": "stdio", "command": "ssh-mcp-pro", "args": [] }}}',
58
+ " Debug: MCP_STDIO=1 ssh-mcp-pro",
59
+ "",
60
+ ].join("\n");
61
+ process.stdout.write(help);
62
+ }
63
+ function printVersion() {
64
+ const pkg = getPackageInfo();
65
+ process.stdout.write(`${pkg.version ?? "0.0.0"}\n`);
66
+ }
67
+ async function main() {
68
+ const argv = process.argv.slice(2);
69
+ const opts = parseArgs(argv);
70
+ if (opts.unsupportedNoStdio) {
71
+ process.stderr.write("Error: --no-stdio is not supported. This server only runs over stdio.\n");
72
+ process.exit(2);
73
+ }
74
+ if (opts.help) {
75
+ printHelp();
76
+ process.exit(0);
77
+ }
78
+ if (opts.version) {
79
+ printVersion();
80
+ process.exit(0);
81
+ }
82
+ if (opts.agentArgs) {
83
+ const { runAgentCli } = await import("./remote/agent-cli.js");
84
+ await runAgentCli(opts.agentArgs);
85
+ return;
86
+ }
87
+ if (opts.transport === "http") {
88
+ if (opts.host) {
89
+ process.env.SSH_MCP_HTTP_HOST = opts.host;
90
+ }
91
+ if (opts.port) {
92
+ process.env.SSH_MCP_HTTP_PORT = opts.port;
93
+ }
94
+ if (opts.bearerTokenFile) {
95
+ process.env.SSH_MCP_HTTP_BEARER_TOKEN_FILE = opts.bearerTokenFile;
96
+ }
97
+ if (opts.enableLegacySse) {
98
+ process.env.SSH_MCP_ENABLE_LEGACY_SSE = "true";
99
+ }
100
+ if (opts.toolProfile) {
101
+ process.env.SSH_MCP_TOOL_PROFILE = opts.toolProfile;
102
+ }
103
+ if (opts.connectorCredentialProvider) {
104
+ process.env.SSH_MCP_CONNECTOR_CREDENTIAL_PROVIDER = opts.connectorCredentialProvider;
105
+ }
106
+ await import("./server-http.js");
107
+ return;
108
+ }
109
+ try {
110
+ logger.info("Starting SSH MCP Server...");
111
+ container = createContainer();
112
+ initTelemetry({
113
+ serviceVersion: SERVER_VERSION,
114
+ });
115
+ const server = new SSHMCPServer(container);
116
+ await server.run();
117
+ // Gentle warning if a human types into the terminal
118
+ let warned = false;
119
+ process.stdin.on("data", (chunk) => {
120
+ const trimmed = chunk.toString().trimStart();
121
+ if (!warned && trimmed && !trimmed.startsWith("{") && !trimmed.startsWith("[")) {
122
+ process.stderr.write("This is an MCP stdio server. Do not type commands here. Use an MCP client or run --help.\n");
123
+ warned = true;
124
+ }
125
+ });
126
+ // Check if running in daemon mode (for testing)
127
+ if (process.env.SSH_MCP_DAEMON === "true") {
128
+ logger.info("Running in daemon mode - will not wait for stdin");
129
+ // Keep alive but don't block on stdin
130
+ setInterval(() => { }, 1000);
131
+ }
132
+ else if (process.env.SSH_MCP_ONESHOT === "true") {
133
+ logger.info("Running in one-shot mode - will exit after processing");
134
+ // Process stdin once and exit with timeout
135
+ const timeout = setTimeout(() => {
136
+ logger.info("One-shot mode timeout, exiting");
137
+ process.exit(0);
138
+ }, 2000);
139
+ process.stdin.once("data", () => {
140
+ clearTimeout(timeout);
141
+ setTimeout(() => process.exit(0), 100);
142
+ });
143
+ process.stdin.resume();
144
+ }
145
+ else {
146
+ // Keep the process running for MCP stdio communication
147
+ process.stdin.resume();
148
+ }
149
+ }
150
+ catch (error) {
151
+ logger.error("Failed to start SSH MCP Server", { error });
152
+ process.exit(1);
153
+ }
154
+ }
155
+ // Handle uncaught exceptions
156
+ process.on("uncaughtException", (error) => {
157
+ logger.error("Uncaught exception", { error });
158
+ process.exit(1);
159
+ });
160
+ process.on("unhandledRejection", (reason, promise) => {
161
+ logger.error("Unhandled rejection", { reason, promise });
162
+ process.exit(1);
163
+ });
164
+ // Handle graceful shutdown
165
+ let shuttingDown = false;
166
+ let container;
167
+ async function gracefulShutdown(signal) {
168
+ if (shuttingDown) {
169
+ // Second signal = force exit immediately
170
+ logger.info("Force exit");
171
+ process.exit(0);
172
+ }
173
+ shuttingDown = true;
174
+ logger.info(`Received ${signal}, shutting down...`);
175
+ // Force exit after 2 seconds max
176
+ const forceExit = setTimeout(() => {
177
+ logger.info("Shutdown timeout, forcing exit");
178
+ process.exit(0);
179
+ }, 2000);
180
+ try {
181
+ container?.rateLimiter.destroy();
182
+ if (container) {
183
+ await container.sessionManager.destroy();
184
+ }
185
+ await shutdownTelemetry();
186
+ }
187
+ catch (error) {
188
+ logger.error("Shutdown error", { error });
189
+ }
190
+ clearTimeout(forceExit);
191
+ process.exit(0);
192
+ }
193
+ process.on("SIGINT", () => {
194
+ void gracefulShutdown("SIGINT");
195
+ });
196
+ process.on("SIGTERM", () => {
197
+ void gracefulShutdown("SIGTERM");
198
+ });
199
+ // Run the server
200
+ void main();
201
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Logging utilities with sensitive data redaction
3
+ */
4
+ /**
5
+ * Redacts sensitive information from an object
6
+ */
7
+ export declare function redactSensitiveData(obj: unknown): unknown;
8
+ /**
9
+ * Redacts sensitive information from error messages and stack traces
10
+ */
11
+ export declare function redactErrorMessage(message: string): string;
12
+ /**
13
+ * Logger levels
14
+ */
15
+ export declare enum LogLevel {
16
+ SILENT = -1,
17
+ ERROR = 0,
18
+ WARN = 1,
19
+ INFO = 2,
20
+ DEBUG = 3
21
+ }
22
+ export type LogFormat = "plain" | "json";
23
+ /**
24
+ * Simple logger with redaction
25
+ */
26
+ export declare class Logger {
27
+ private readonly level;
28
+ private readonly format;
29
+ constructor(level?: LogLevel, format?: LogFormat);
30
+ private writePlain;
31
+ private writeJson;
32
+ private log;
33
+ error(message: string, data?: unknown): void;
34
+ warn(message: string, data?: unknown): void;
35
+ info(message: string, data?: unknown): void;
36
+ debug(message: string, data?: unknown): void;
37
+ }
38
+ export declare const logger: Logger;
39
+ /**
40
+ * Performance measurement utilities
41
+ */
42
+ export declare class Timer {
43
+ private startTime;
44
+ constructor();
45
+ elapsed(): number;
46
+ reset(): void;
47
+ }
48
+ /**
49
+ * Creates a timer for measuring operation duration
50
+ */
51
+ export declare function createTimer(): Timer;
52
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CA0BzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAqB1D;AAED;;GAEG;AACH,oBAAY,QAAQ;IAClB,MAAM,KAAK;IACX,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzC;;GAEG;AACH,qBAAa,MAAM;IAEf,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,KAAK,GAAE,QAAwB,EAC/B,MAAM,GAAE,SAAmB;IAG9C,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,GAAG;IAiBX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAK5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;CAG7C;AAuBD,eAAO,MAAM,MAAM,QAAkC,CAAC;AAEtD;;GAEG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAS;;IAM1B,OAAO,IAAI,MAAM;IAIjB,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,KAAK,CAEnC"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Logging utilities with sensitive data redaction
3
+ */
4
+ const SENSITIVE_PATTERNS = [
5
+ /password/i,
6
+ /privatekey/i,
7
+ /passphrase/i,
8
+ /sudopassword/i,
9
+ /secret/i,
10
+ /token/i,
11
+ /credential/i,
12
+ /auth/i,
13
+ /api.?key/i,
14
+ /bearer/i,
15
+ /private.?key/i,
16
+ /pem/i,
17
+ ];
18
+ const REDACTED = "****";
19
+ function isRecord(value) {
20
+ return typeof value === "object" && !!value;
21
+ }
22
+ function shouldPreserveSensitiveValue(value) {
23
+ return value === null || value === undefined || value === "" || typeof value === "boolean";
24
+ }
25
+ /**
26
+ * Redacts sensitive information from an object
27
+ */
28
+ export function redactSensitiveData(obj) {
29
+ if (obj === null || obj === undefined) {
30
+ return obj;
31
+ }
32
+ if (typeof obj === "string") {
33
+ return obj;
34
+ }
35
+ if (Array.isArray(obj)) {
36
+ return obj.map(redactSensitiveData);
37
+ }
38
+ if (isRecord(obj)) {
39
+ const redacted = {};
40
+ for (const [key, value] of Object.entries(obj)) {
41
+ if (SENSITIVE_PATTERNS.some((pattern) => pattern.test(key))) {
42
+ redacted[key] = shouldPreserveSensitiveValue(value) ? value : REDACTED;
43
+ }
44
+ else {
45
+ redacted[key] = redactSensitiveData(value);
46
+ }
47
+ }
48
+ return redacted;
49
+ }
50
+ return obj;
51
+ }
52
+ /**
53
+ * Redacts sensitive information from error messages and stack traces
54
+ */
55
+ export function redactErrorMessage(message) {
56
+ // Common patterns that might contain sensitive data
57
+ const patterns = [
58
+ /password[=:\s]+[^\s]+/gi,
59
+ /key[=:\s]+[^\s]+/gi,
60
+ /passphrase[=:\s]+[^\s]+/gi,
61
+ /auth[=:\s]+[^\s]+/gi,
62
+ /token[=:\s]+[^\s]+/gi,
63
+ /api.?key[=:\s]+[^\s]+/gi,
64
+ /bearer\s+[^\s]+/gi,
65
+ /private.?key[=:\s]+[^\s]+/gi,
66
+ /pem[=:\s]+[^\s]+/gi,
67
+ /-----BEGIN[^-]+-----[\s\S]*?-----END[^-]+-----/gi,
68
+ ];
69
+ let redacted = message;
70
+ for (const pattern of patterns) {
71
+ redacted = redacted.replace(pattern, REDACTED);
72
+ }
73
+ return redacted;
74
+ }
75
+ /**
76
+ * Logger levels
77
+ */
78
+ export var LogLevel;
79
+ (function (LogLevel) {
80
+ LogLevel[LogLevel["SILENT"] = -1] = "SILENT";
81
+ LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
82
+ LogLevel[LogLevel["WARN"] = 1] = "WARN";
83
+ LogLevel[LogLevel["INFO"] = 2] = "INFO";
84
+ LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
85
+ })(LogLevel || (LogLevel = {}));
86
+ /**
87
+ * Simple logger with redaction
88
+ */
89
+ export class Logger {
90
+ level;
91
+ format;
92
+ constructor(level = LogLevel.INFO, format = "plain") {
93
+ this.level = level;
94
+ this.format = format;
95
+ }
96
+ writePlain(timestamp, levelName, message, data) {
97
+ let output = `[${timestamp}] ${levelName}: ${message}`;
98
+ if (data !== undefined) {
99
+ output += ` ${JSON.stringify(data)}`;
100
+ }
101
+ process.stderr.write(`${output}\n`);
102
+ }
103
+ writeJson(timestamp, levelName, message, data) {
104
+ const output = {
105
+ timestamp,
106
+ level: levelName.toLowerCase(),
107
+ message,
108
+ ...(data !== undefined ? { data } : {}),
109
+ };
110
+ process.stderr.write(`${JSON.stringify(output)}\n`);
111
+ }
112
+ log(level, message, data) {
113
+ if (level > this.level) {
114
+ return;
115
+ }
116
+ const timestamp = new Date().toISOString();
117
+ const levelName = LogLevel[level];
118
+ const redactedData = data !== undefined ? redactSensitiveData(data) : undefined;
119
+ if (this.format === "json") {
120
+ this.writeJson(timestamp, levelName, message, redactedData);
121
+ return;
122
+ }
123
+ this.writePlain(timestamp, levelName, message, redactedData);
124
+ }
125
+ error(message, data) {
126
+ const redactedMessage = redactErrorMessage(message);
127
+ this.log(LogLevel.ERROR, redactedMessage, data);
128
+ }
129
+ warn(message, data) {
130
+ this.log(LogLevel.WARN, message, data);
131
+ }
132
+ info(message, data) {
133
+ this.log(LogLevel.INFO, message, data);
134
+ }
135
+ debug(message, data) {
136
+ this.log(LogLevel.DEBUG, message, data);
137
+ }
138
+ }
139
+ // Global logger instance
140
+ const LOG_LEVEL_MAP = {
141
+ none: LogLevel.SILENT,
142
+ off: LogLevel.SILENT,
143
+ silent: LogLevel.SILENT,
144
+ error: LogLevel.ERROR,
145
+ warn: LogLevel.WARN,
146
+ info: LogLevel.INFO,
147
+ debug: LogLevel.DEBUG,
148
+ };
149
+ const LOG_FORMAT_MAP = {
150
+ plain: "plain",
151
+ pretty: "plain",
152
+ json: "json",
153
+ };
154
+ const envLogLevel = process.env.LOG_LEVEL?.toLowerCase() ?? "info";
155
+ const logLevel = LOG_LEVEL_MAP[envLogLevel] ?? LogLevel.INFO;
156
+ const envLogFormat = process.env.LOG_FORMAT?.toLowerCase() ?? "plain";
157
+ const logFormat = LOG_FORMAT_MAP[envLogFormat] ?? "plain";
158
+ export const logger = new Logger(logLevel, logFormat);
159
+ /**
160
+ * Performance measurement utilities
161
+ */
162
+ export class Timer {
163
+ startTime;
164
+ constructor() {
165
+ this.startTime = Date.now();
166
+ }
167
+ elapsed() {
168
+ return Date.now() - this.startTime;
169
+ }
170
+ reset() {
171
+ this.startTime = Date.now();
172
+ }
173
+ }
174
+ /**
175
+ * Creates a timer for measuring operation duration
176
+ */
177
+ export function createTimer() {
178
+ return new Timer();
179
+ }
180
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
2
+ import type { AppContainer } from "./container.js";
3
+ export declare const SERVER_VERSION = "1.0.0";
4
+ export declare const SERVER_NAME = "io.github.oaslananka/ssh-mcp-pro";
5
+ export declare class SSHMCPServer {
6
+ private readonly container;
7
+ private readonly server;
8
+ private readonly registry;
9
+ private readonly toolProfile;
10
+ constructor(container: AppContainer);
11
+ private setupHandlers;
12
+ private setupErrorHandling;
13
+ run(): Promise<void>;
14
+ connect(transport: Transport): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=mcp.d.ts.map