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,360 @@
1
+ import { z } from "zod";
2
+ import { resolveConnectorCredentials, } from "../connector-credentials.js";
3
+ import { getConfiguredHosts } from "../ssh-config.js";
4
+ import { annotate } from "./metadata.js";
5
+ import { CONNECTOR_STATUS_OUTPUT_SCHEMA, HOST_INSPECT_OUTPUT_SCHEMA, MUTATION_PLAN_OUTPUT_SCHEMA, POLICY_EXPLAIN_OUTPUT_SCHEMA, SSH_HOSTS_LIST_OUTPUT_SCHEMA, } from "./output-schemas.js";
6
+ const PolicyExplainSchema = z.object({
7
+ hostAlias: z.string().min(1).optional(),
8
+ action: z
9
+ .enum(["inspect", "mutation", "destructive-mutation"])
10
+ .default("inspect")
11
+ .describe("Requested action class to evaluate without executing it"),
12
+ command: z.string().optional(),
13
+ path: z.string().optional(),
14
+ });
15
+ const MutationPlanSchema = z.object({
16
+ hostAlias: z.string().min(1),
17
+ goal: z.string().min(1).max(1000),
18
+ category: z.enum(["package", "service", "file", "command", "tunnel", "other"]).default("other"),
19
+ });
20
+ const HostInspectSchema = z.object({
21
+ hostAlias: z.string().min(1),
22
+ checks: z
23
+ .array(z.enum(["os", "uptime", "disk", "memory"]))
24
+ .min(1)
25
+ .max(4)
26
+ .optional()
27
+ .default(["os"]),
28
+ });
29
+ export class ConnectorToolProvider {
30
+ deps;
31
+ namespace = "connector";
32
+ constructor(deps) {
33
+ this.deps = deps;
34
+ }
35
+ getTools() {
36
+ return [
37
+ {
38
+ name: "connector_status",
39
+ description: "Use this when ChatGPT or Claude needs to understand the remote connector profile, authentication mode, and credential broker readiness without exposing secrets.",
40
+ annotations: annotate({
41
+ title: "Connector Status",
42
+ readOnly: true,
43
+ idempotent: true,
44
+ openWorld: false,
45
+ }),
46
+ outputSchema: CONNECTOR_STATUS_OUTPUT_SCHEMA,
47
+ inputSchema: {
48
+ type: "object",
49
+ properties: {},
50
+ required: [],
51
+ },
52
+ },
53
+ {
54
+ name: "ssh_hosts_list",
55
+ description: "Use this when ChatGPT or Claude needs a safe list of SSH host aliases that may be inspected through the remote connector. Sensitive login material is omitted.",
56
+ annotations: annotate({
57
+ title: "List Safe SSH Host Aliases",
58
+ readOnly: true,
59
+ idempotent: true,
60
+ openWorld: false,
61
+ }),
62
+ outputSchema: SSH_HOSTS_LIST_OUTPUT_SCHEMA,
63
+ inputSchema: {
64
+ type: "object",
65
+ properties: {},
66
+ required: [],
67
+ },
68
+ },
69
+ {
70
+ name: "ssh_policy_explain",
71
+ description: "Use this when ChatGPT or Claude needs to explain whether a requested SSH inspection or mutation would be allowed. This is explain-only and does not execute commands or open tunnels.",
72
+ annotations: annotate({
73
+ title: "Explain SSH Policy",
74
+ readOnly: true,
75
+ idempotent: true,
76
+ openWorld: false,
77
+ }),
78
+ outputSchema: POLICY_EXPLAIN_OUTPUT_SCHEMA,
79
+ inputSchema: {
80
+ type: "object",
81
+ properties: {
82
+ hostAlias: { type: "string", description: "Configured SSH host alias" },
83
+ action: {
84
+ type: "string",
85
+ enum: ["inspect", "mutation", "destructive-mutation"],
86
+ description: "Requested action class to evaluate without executing it",
87
+ },
88
+ command: {
89
+ type: "string",
90
+ description: "Optional command to evaluate in explain mode",
91
+ },
92
+ path: {
93
+ type: "string",
94
+ description: "Optional remote path to evaluate in explain mode",
95
+ },
96
+ },
97
+ required: [],
98
+ },
99
+ },
100
+ {
101
+ name: "ssh_host_inspect",
102
+ description: "Use this when ChatGPT or Claude needs read-only host inspection through the server-side credential broker. The user supplies only a configured host alias and selected checks; no secret material or login details are accepted.",
103
+ annotations: annotate({
104
+ title: "Inspect SSH Host",
105
+ readOnly: true,
106
+ idempotent: false,
107
+ openWorld: false,
108
+ }),
109
+ outputSchema: HOST_INSPECT_OUTPUT_SCHEMA,
110
+ inputSchema: {
111
+ type: "object",
112
+ properties: {
113
+ hostAlias: { type: "string", description: "Configured SSH host alias" },
114
+ checks: {
115
+ type: "array",
116
+ description: "Read-only checks to run",
117
+ items: { type: "string", enum: ["os", "uptime", "disk", "memory"] },
118
+ minItems: 1,
119
+ maxItems: 4,
120
+ },
121
+ },
122
+ required: ["hostAlias"],
123
+ },
124
+ },
125
+ {
126
+ name: "ssh_mutation_plan",
127
+ description: "Use this when ChatGPT or Claude needs a non-executing plan for a remote SSH change. It never runs commands, writes files, uploads data, starts tunnels, or escalates privileges.",
128
+ annotations: annotate({
129
+ title: "Plan SSH Mutation",
130
+ readOnly: true,
131
+ destructive: false,
132
+ idempotent: true,
133
+ openWorld: false,
134
+ }),
135
+ outputSchema: MUTATION_PLAN_OUTPUT_SCHEMA,
136
+ inputSchema: {
137
+ type: "object",
138
+ properties: {
139
+ hostAlias: { type: "string", description: "Configured SSH host alias" },
140
+ goal: {
141
+ type: "string",
142
+ description: "Desired change to plan without executing",
143
+ maxLength: 1000,
144
+ },
145
+ category: {
146
+ type: "string",
147
+ enum: ["package", "service", "file", "command", "tunnel", "other"],
148
+ description: "Change category used for policy explanation",
149
+ },
150
+ },
151
+ required: ["hostAlias", "goal"],
152
+ },
153
+ },
154
+ ];
155
+ }
156
+ handleTool(toolName, args) {
157
+ switch (toolName) {
158
+ case "connector_status":
159
+ return this.status();
160
+ case "ssh_hosts_list":
161
+ return this.listHosts();
162
+ case "ssh_policy_explain":
163
+ return this.explainPolicy(args);
164
+ case "ssh_host_inspect":
165
+ return this.inspectHost(args);
166
+ case "ssh_mutation_plan":
167
+ return this.planMutation(args);
168
+ default:
169
+ return undefined;
170
+ }
171
+ }
172
+ async status() {
173
+ const { connector, auth, http, policy } = this.deps.config;
174
+ return {
175
+ toolProfile: connector.toolProfile,
176
+ credentialProvider: connector.credentialProvider,
177
+ credentialBrokerConfigured: connector.credentialProvider === "agent" ||
178
+ (connector.credentialProvider === "command" && Boolean(connector.credentialCommand)),
179
+ authMode: auth.mode,
180
+ oauthConfigured: auth.mode === "oauth" && Boolean(auth.oauthIssuer && auth.oauthJwksUrl),
181
+ nonLoopbackHttpRequiresAuthAndOrigins: true,
182
+ allowedOriginsConfigured: http.allowedOrigins.length > 0,
183
+ publicUrlConfigured: Boolean(http.publicUrl),
184
+ maxHttpSessions: http.maxSessions,
185
+ httpSessionIdleTtlMs: http.sessionIdleTtlMs,
186
+ hostAllowlistConfigured: policy.allowedHosts.length > 0,
187
+ safeRemoteToolsOnly: connector.toolProfile !== "full",
188
+ credentialEntryInChat: false,
189
+ privateKeysInChat: false,
190
+ rawCommandExecutionDefault: false,
191
+ destructiveExecutionDefault: false,
192
+ };
193
+ }
194
+ async listHosts() {
195
+ const configuredHosts = await (this.deps.getConfiguredHosts ?? getConfiguredHosts)();
196
+ const allowedHosts = this.deps.config.policy.allowedHosts;
197
+ const hosts = configuredHosts
198
+ .filter((hostAlias) => isHostAllowed(hostAlias, allowedHosts))
199
+ .map((hostAlias) => ({
200
+ hostAlias,
201
+ allowedByPolicy: true,
202
+ }));
203
+ return {
204
+ count: hosts.length,
205
+ hosts,
206
+ redactedFields: ["username", "identityFile", "privateKeyPath", "password", "passphrase"],
207
+ hostAllowlistRequired: true,
208
+ hostAllowlistConfigured: allowedHosts.length > 0,
209
+ };
210
+ }
211
+ async explainPolicy(args) {
212
+ const input = PolicyExplainSchema.parse(args ?? {});
213
+ const action = mapPolicyAction(input.action, input.path);
214
+ const context = {
215
+ action,
216
+ destructive: input.action === "destructive-mutation",
217
+ rawSudo: input.command?.trimStart().startsWith("sudo ") ?? false,
218
+ };
219
+ if (input.hostAlias) {
220
+ context.host = input.hostAlias;
221
+ }
222
+ if (input.command) {
223
+ context.command = input.command;
224
+ }
225
+ if (input.path) {
226
+ context.path = input.path;
227
+ }
228
+ const decision = this.deps.policy.explain(context);
229
+ return {
230
+ executed: false,
231
+ toolProfile: this.deps.config.connector.toolProfile,
232
+ decision,
233
+ requiresExplicitUserConfirmation: input.action !== "inspect",
234
+ };
235
+ }
236
+ async planMutation(args) {
237
+ const input = MutationPlanSchema.parse(args ?? {});
238
+ const decision = this.deps.policy.explain({
239
+ action: mapMutationCategory(input.category),
240
+ host: input.hostAlias,
241
+ destructive: input.category === "file" || input.category === "command",
242
+ });
243
+ return {
244
+ executed: false,
245
+ hostAlias: input.hostAlias,
246
+ goal: input.goal,
247
+ category: input.category,
248
+ policyDecision: decision,
249
+ requiredBeforeExecution: [
250
+ "server-side credential broker configured",
251
+ "host allowlist permits the target alias",
252
+ "strict host-key verification remains active",
253
+ "policy explicitly allows the concrete operation",
254
+ "user reviews and confirms the concrete tool payload",
255
+ ],
256
+ disallowedInRemoteConnectorProfile: [
257
+ "chat-entered SSH passwords",
258
+ "chat-entered private keys",
259
+ "raw command execution",
260
+ "sudo execution",
261
+ "file writes or deletes",
262
+ "file transfers",
263
+ "tunnels",
264
+ ],
265
+ };
266
+ }
267
+ async inspectHost(args) {
268
+ const input = HostInspectSchema.parse(args ?? {});
269
+ const credentialResolver = this.deps.resolveConnectorCredentials ?? resolveConnectorCredentials;
270
+ const credentials = await credentialResolver({ hostAlias: input.hostAlias, purpose: "inspect" }, this.deps.config);
271
+ const session = await this.deps.sessionManager.openSession(credentials);
272
+ this.deps.metrics.recordSessionCreated();
273
+ try {
274
+ const inspection = {};
275
+ for (const check of input.checks) {
276
+ if (check === "os") {
277
+ inspection.os = await this.deps.sessionManager.getOSInfo(session.sessionId);
278
+ continue;
279
+ }
280
+ const active = this.deps.sessionManager.getSession(session.sessionId);
281
+ if (!active) {
282
+ throw new Error("Inspection session expired unexpectedly.");
283
+ }
284
+ const result = await active.ssh.execCommand(commandForCheck(check));
285
+ inspection[check] = {
286
+ code: result.code ?? 0,
287
+ stdout: truncate(result.stdout),
288
+ stderr: truncate(result.stderr),
289
+ };
290
+ }
291
+ return {
292
+ hostAlias: input.hostAlias,
293
+ host: credentials.host,
294
+ checks: input.checks,
295
+ inspection,
296
+ credentialsFromChat: false,
297
+ strictHostKeyVerification: credentials.hostKeyPolicy === "strict",
298
+ };
299
+ }
300
+ finally {
301
+ await this.deps.sessionManager.closeSession(session.sessionId);
302
+ this.deps.metrics.recordSessionClosed();
303
+ }
304
+ }
305
+ }
306
+ function isHostAllowed(hostAlias, allowedHosts) {
307
+ if (allowedHosts.length === 0) {
308
+ return false;
309
+ }
310
+ return allowedHosts.some((allowed) => {
311
+ if (allowed === hostAlias) {
312
+ return true;
313
+ }
314
+ try {
315
+ return new RegExp(allowed).test(hostAlias);
316
+ }
317
+ catch {
318
+ return false;
319
+ }
320
+ });
321
+ }
322
+ function mapPolicyAction(action, path) {
323
+ if (action === "inspect") {
324
+ return path ? "fs.read" : "ssh.open";
325
+ }
326
+ return path ? "fs.write" : "proc.exec";
327
+ }
328
+ function mapMutationCategory(category) {
329
+ switch (category) {
330
+ case "package":
331
+ return "ensure.package";
332
+ case "service":
333
+ return "ensure.service";
334
+ case "file":
335
+ return "fs.write";
336
+ case "tunnel":
337
+ return "tunnel.local";
338
+ case "command":
339
+ case "other":
340
+ default:
341
+ return "proc.exec";
342
+ }
343
+ }
344
+ function commandForCheck(check) {
345
+ switch (check) {
346
+ case "uptime":
347
+ return "uptime";
348
+ case "disk":
349
+ return "df -h /";
350
+ case "memory":
351
+ return "free -m || vm_stat || wmic OS get FreePhysicalMemory,TotalVisibleMemorySize /Value";
352
+ }
353
+ }
354
+ function truncate(value, limit = 4000) {
355
+ if (value.length <= limit) {
356
+ return value;
357
+ }
358
+ return `${value.slice(0, limit)}\n[truncated]`;
359
+ }
360
+ //# sourceMappingURL=connector.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.provider.js","sourceRoot":"","sources":["../../src/tools/connector.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import type { EnsureService } from "../ensure.js";
3
+ import type { ToolProvider } from "./types.js";
4
+ export interface EnsureToolProviderDeps {
5
+ ensureService: EnsureService;
6
+ }
7
+ export declare class EnsureToolProvider implements ToolProvider {
8
+ private readonly deps;
9
+ readonly namespace = "ensure";
10
+ constructor(deps: EnsureToolProviderDeps);
11
+ getTools(): Tool[];
12
+ handleTool(toolName: string, args: unknown): Promise<unknown> | undefined;
13
+ private ensurePackage;
14
+ private ensureSystemService;
15
+ private ensureLines;
16
+ private applyPatch;
17
+ }
18
+ //# sourceMappingURL=ensure.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure.provider.d.ts","sourceRoot":"","sources":["../../src/tools/ensure.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAelD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,kBAAmB,YAAW,YAAY;IAGzC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,SAAS,YAAY;gBAED,IAAI,EAAE,sBAAsB;IAEzD,QAAQ,IAAI,IAAI,EAAE;IA6GlB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS;YAe3D,aAAa;YAeb,mBAAmB;YAenB,WAAW;YAiBX,UAAU;CAazB"}
@@ -0,0 +1,173 @@
1
+ import { logger } from "../logging.js";
2
+ import { EnsureLinesSchema, EnsurePackageSchema, EnsureServiceSchema, PatchApplySchema, } from "../types.js";
3
+ import { annotate } from "./metadata.js";
4
+ import { LINES_OUTPUT_SCHEMA, PACKAGE_OUTPUT_SCHEMA, PATCH_OUTPUT_SCHEMA, SERVICE_OUTPUT_SCHEMA, } from "./output-schemas.js";
5
+ export class EnsureToolProvider {
6
+ deps;
7
+ namespace = "ensure";
8
+ constructor(deps) {
9
+ this.deps = deps;
10
+ }
11
+ getTools() {
12
+ return [
13
+ {
14
+ name: "ensure_package",
15
+ description: "Ensures a package is installed or removed",
16
+ annotations: annotate({
17
+ title: "Ensure Package State",
18
+ readOnly: false,
19
+ destructive: true,
20
+ idempotent: true,
21
+ }),
22
+ outputSchema: PACKAGE_OUTPUT_SCHEMA,
23
+ inputSchema: {
24
+ type: "object",
25
+ properties: {
26
+ sessionId: { type: "string", description: "SSH session ID" },
27
+ name: { type: "string", description: "Package name" },
28
+ state: {
29
+ type: "string",
30
+ enum: ["present", "absent"],
31
+ description: "Desired state",
32
+ },
33
+ },
34
+ required: ["sessionId", "name"],
35
+ },
36
+ },
37
+ {
38
+ name: "ensure_service",
39
+ description: "Ensures a service is in the desired state",
40
+ annotations: annotate({
41
+ title: "Ensure Service State",
42
+ readOnly: false,
43
+ destructive: true,
44
+ idempotent: true,
45
+ }),
46
+ outputSchema: SERVICE_OUTPUT_SCHEMA,
47
+ inputSchema: {
48
+ type: "object",
49
+ properties: {
50
+ sessionId: { type: "string", description: "SSH session ID" },
51
+ name: { type: "string", description: "Service name" },
52
+ state: {
53
+ type: "string",
54
+ enum: ["started", "stopped", "restarted", "enabled", "disabled"],
55
+ description: "Desired state",
56
+ },
57
+ },
58
+ required: ["sessionId", "name", "state"],
59
+ },
60
+ },
61
+ {
62
+ name: "ensure_lines_in_file",
63
+ description: "Ensures specific lines are present or absent in a file",
64
+ annotations: annotate({
65
+ title: "Ensure Lines In File",
66
+ readOnly: false,
67
+ destructive: true,
68
+ idempotent: true,
69
+ }),
70
+ outputSchema: LINES_OUTPUT_SCHEMA,
71
+ inputSchema: {
72
+ type: "object",
73
+ properties: {
74
+ sessionId: { type: "string", description: "SSH session ID" },
75
+ path: { type: "string", description: "File path" },
76
+ lines: {
77
+ type: "array",
78
+ items: { type: "string" },
79
+ description: "Lines to manage",
80
+ },
81
+ state: {
82
+ type: "string",
83
+ enum: ["present", "absent"],
84
+ description: "Desired state",
85
+ },
86
+ createIfMissing: {
87
+ type: "boolean",
88
+ description: "Create file if it does not exist",
89
+ },
90
+ },
91
+ required: ["sessionId", "path", "lines"],
92
+ },
93
+ },
94
+ {
95
+ name: "patch_apply",
96
+ description: "Applies a patch to a file",
97
+ annotations: annotate({
98
+ title: "Apply Patch",
99
+ readOnly: false,
100
+ destructive: true,
101
+ idempotent: false,
102
+ }),
103
+ outputSchema: PATCH_OUTPUT_SCHEMA,
104
+ inputSchema: {
105
+ type: "object",
106
+ properties: {
107
+ sessionId: { type: "string", description: "SSH session ID" },
108
+ path: { type: "string", description: "File path to patch" },
109
+ diff: {
110
+ type: "string",
111
+ description: "Patch content (unified diff format)",
112
+ },
113
+ },
114
+ required: ["sessionId", "path", "diff"],
115
+ },
116
+ },
117
+ ];
118
+ }
119
+ handleTool(toolName, args) {
120
+ switch (toolName) {
121
+ case "ensure_package":
122
+ return this.ensurePackage(args);
123
+ case "ensure_service":
124
+ return this.ensureSystemService(args);
125
+ case "ensure_lines_in_file":
126
+ return this.ensureLines(args);
127
+ case "patch_apply":
128
+ return this.applyPatch(args);
129
+ default:
130
+ return undefined;
131
+ }
132
+ }
133
+ async ensurePackage(args) {
134
+ const params = EnsurePackageSchema.parse(args);
135
+ const result = await this.deps.ensureService.ensurePackage(params.sessionId, params.name, params.state);
136
+ logger.info("Package ensured", {
137
+ sessionId: params.sessionId,
138
+ name: params.name,
139
+ state: params.state,
140
+ });
141
+ return result;
142
+ }
143
+ async ensureSystemService(args) {
144
+ const params = EnsureServiceSchema.parse(args);
145
+ const result = await this.deps.ensureService.ensureService(params.sessionId, params.name, params.state);
146
+ logger.info("Service ensured", {
147
+ sessionId: params.sessionId,
148
+ name: params.name,
149
+ state: params.state,
150
+ });
151
+ return result;
152
+ }
153
+ async ensureLines(args) {
154
+ const params = EnsureLinesSchema.parse(args);
155
+ const result = await this.deps.ensureService.ensureLinesInFile(params.sessionId, params.path, params.lines, params.createIfMissing, params.state);
156
+ logger.info("Lines ensured in file", {
157
+ sessionId: params.sessionId,
158
+ path: params.path,
159
+ state: params.state,
160
+ });
161
+ return result;
162
+ }
163
+ async applyPatch(args) {
164
+ const params = PatchApplySchema.parse(args);
165
+ const result = await this.deps.ensureService.applyPatch(params.sessionId, params.path, params.diff);
166
+ logger.info("Patch applied", {
167
+ sessionId: params.sessionId,
168
+ path: params.path,
169
+ });
170
+ return result;
171
+ }
172
+ }
173
+ //# sourceMappingURL=ensure.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure.provider.js","sourceRoot":"","sources":["../../src/tools/ensure.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import type { FsService } from "../fs-tools.js";
3
+ import type { ToolProvider } from "./types.js";
4
+ export interface FsToolProviderDeps {
5
+ fsService: FsService;
6
+ }
7
+ export declare class FsToolProvider implements ToolProvider {
8
+ private readonly deps;
9
+ readonly namespace = "fs";
10
+ constructor(deps: FsToolProviderDeps);
11
+ getTools(): Tool[];
12
+ handleTool(toolName: string, args: unknown): Promise<unknown> | undefined;
13
+ private read;
14
+ private write;
15
+ private stat;
16
+ private list;
17
+ private mkdirp;
18
+ private rmrf;
19
+ private rename;
20
+ }
21
+ //# sourceMappingURL=fs.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.provider.d.ts","sourceRoot":"","sources":["../../src/tools/fs.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAkBhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,qBAAa,cAAe,YAAW,YAAY;IAGrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,SAAS,QAAQ;gBAEG,IAAI,EAAE,kBAAkB;IAErD,QAAQ,IAAI,IAAI,EAAE;IAuJlB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS;YAqB3D,IAAI;YAYJ,KAAK;YAeL,IAAI;YAOJ,IAAI;YAeJ,MAAM;YAUN,IAAI;YAUJ,MAAM;CAUrB"}