quicklify 1.0.5 → 1.2.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 (214) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +86 -25
  3. package/README.tr.md +86 -25
  4. package/SECURITY.md +79 -17
  5. package/bin/quicklify-mcp +5 -0
  6. package/dist/commands/add.d.ts +1 -0
  7. package/dist/commands/add.d.ts.map +1 -1
  8. package/dist/commands/add.js +41 -65
  9. package/dist/commands/add.js.map +1 -1
  10. package/dist/commands/backup.d.ts +2 -11
  11. package/dist/commands/backup.d.ts.map +1 -1
  12. package/dist/commands/backup.js +113 -57
  13. package/dist/commands/backup.js.map +1 -1
  14. package/dist/commands/destroy.d.ts.map +1 -1
  15. package/dist/commands/destroy.js +58 -37
  16. package/dist/commands/destroy.js.map +1 -1
  17. package/dist/commands/domain.d.ts +2 -9
  18. package/dist/commands/domain.d.ts.map +1 -1
  19. package/dist/commands/domain.js +47 -56
  20. package/dist/commands/domain.js.map +1 -1
  21. package/dist/commands/firewall.d.ts +3 -10
  22. package/dist/commands/firewall.d.ts.map +1 -1
  23. package/dist/commands/firewall.js +28 -51
  24. package/dist/commands/firewall.js.map +1 -1
  25. package/dist/commands/health.d.ts +2 -2
  26. package/dist/commands/health.d.ts.map +1 -1
  27. package/dist/commands/health.js +77 -19
  28. package/dist/commands/health.js.map +1 -1
  29. package/dist/commands/init.d.ts.map +1 -1
  30. package/dist/commands/init.js +142 -24
  31. package/dist/commands/init.js.map +1 -1
  32. package/dist/commands/interactive.d.ts +2 -0
  33. package/dist/commands/interactive.d.ts.map +1 -0
  34. package/dist/commands/interactive.js +357 -0
  35. package/dist/commands/interactive.js.map +1 -0
  36. package/dist/commands/list.d.ts.map +1 -1
  37. package/dist/commands/list.js +4 -2
  38. package/dist/commands/list.js.map +1 -1
  39. package/dist/commands/logs.d.ts +3 -2
  40. package/dist/commands/logs.d.ts.map +1 -1
  41. package/dist/commands/logs.js +15 -12
  42. package/dist/commands/logs.js.map +1 -1
  43. package/dist/commands/maintain.d.ts.map +1 -1
  44. package/dist/commands/maintain.js +28 -47
  45. package/dist/commands/maintain.js.map +1 -1
  46. package/dist/commands/monitor.d.ts +3 -9
  47. package/dist/commands/monitor.d.ts.map +1 -1
  48. package/dist/commands/monitor.js +3 -48
  49. package/dist/commands/monitor.js.map +1 -1
  50. package/dist/commands/remove.d.ts.map +1 -1
  51. package/dist/commands/remove.js +25 -0
  52. package/dist/commands/remove.js.map +1 -1
  53. package/dist/commands/restart.d.ts.map +1 -1
  54. package/dist/commands/restart.js +39 -39
  55. package/dist/commands/restart.js.map +1 -1
  56. package/dist/commands/restore.d.ts +2 -13
  57. package/dist/commands/restore.d.ts.map +1 -1
  58. package/dist/commands/restore.js +42 -54
  59. package/dist/commands/restore.js.map +1 -1
  60. package/dist/commands/secure.d.ts +2 -9
  61. package/dist/commands/secure.d.ts.map +1 -1
  62. package/dist/commands/secure.js +2 -97
  63. package/dist/commands/secure.js.map +1 -1
  64. package/dist/commands/snapshot.d.ts.map +1 -1
  65. package/dist/commands/snapshot.js +55 -67
  66. package/dist/commands/snapshot.js.map +1 -1
  67. package/dist/commands/ssh.d.ts.map +1 -1
  68. package/dist/commands/ssh.js +4 -1
  69. package/dist/commands/ssh.js.map +1 -1
  70. package/dist/commands/status.d.ts.map +1 -1
  71. package/dist/commands/status.js +53 -85
  72. package/dist/commands/status.js.map +1 -1
  73. package/dist/commands/update.d.ts.map +1 -1
  74. package/dist/commands/update.js +23 -16
  75. package/dist/commands/update.js.map +1 -1
  76. package/dist/constants.d.ts +14 -0
  77. package/dist/constants.d.ts.map +1 -0
  78. package/dist/constants.js +23 -0
  79. package/dist/constants.js.map +1 -0
  80. package/dist/core/backup.d.ts +59 -0
  81. package/dist/core/backup.d.ts.map +1 -0
  82. package/dist/core/backup.js +417 -0
  83. package/dist/core/backup.js.map +1 -0
  84. package/dist/core/domain.d.ts +30 -0
  85. package/dist/core/domain.d.ts.map +1 -0
  86. package/dist/core/domain.js +170 -0
  87. package/dist/core/domain.js.map +1 -0
  88. package/dist/core/firewall.d.ts +27 -0
  89. package/dist/core/firewall.d.ts.map +1 -0
  90. package/dist/core/firewall.js +158 -0
  91. package/dist/core/firewall.js.map +1 -0
  92. package/dist/core/logs.d.ts +28 -0
  93. package/dist/core/logs.d.ts.map +1 -0
  94. package/dist/core/logs.js +129 -0
  95. package/dist/core/logs.js.map +1 -0
  96. package/dist/core/maintain.d.ts +41 -0
  97. package/dist/core/maintain.d.ts.map +1 -0
  98. package/dist/core/maintain.js +179 -0
  99. package/dist/core/maintain.js.map +1 -0
  100. package/dist/core/manage.d.ts +43 -0
  101. package/dist/core/manage.d.ts.map +1 -0
  102. package/dist/core/manage.js +241 -0
  103. package/dist/core/manage.js.map +1 -0
  104. package/dist/core/provision.d.ts +19 -0
  105. package/dist/core/provision.d.ts.map +1 -0
  106. package/dist/core/provision.js +192 -0
  107. package/dist/core/provision.js.map +1 -0
  108. package/dist/core/secure.d.ts +29 -0
  109. package/dist/core/secure.d.ts.map +1 -0
  110. package/dist/core/secure.js +204 -0
  111. package/dist/core/secure.js.map +1 -0
  112. package/dist/core/snapshot.d.ts +22 -0
  113. package/dist/core/snapshot.d.ts.map +1 -0
  114. package/dist/core/snapshot.js +58 -0
  115. package/dist/core/snapshot.js.map +1 -0
  116. package/dist/core/status.d.ts +12 -0
  117. package/dist/core/status.d.ts.map +1 -0
  118. package/dist/core/status.js +44 -0
  119. package/dist/core/status.js.map +1 -0
  120. package/dist/core/tokens.d.ts +4 -0
  121. package/dist/core/tokens.d.ts.map +1 -0
  122. package/dist/core/tokens.js +23 -0
  123. package/dist/core/tokens.js.map +1 -0
  124. package/dist/index.js +17 -4
  125. package/dist/index.js.map +1 -1
  126. package/dist/mcp/index.d.ts +3 -0
  127. package/dist/mcp/index.d.ts.map +1 -0
  128. package/dist/mcp/index.js +16 -0
  129. package/dist/mcp/index.js.map +1 -0
  130. package/dist/mcp/server.d.ts +3 -0
  131. package/dist/mcp/server.d.ts.map +1 -0
  132. package/dist/mcp/server.js +111 -0
  133. package/dist/mcp/server.js.map +1 -0
  134. package/dist/mcp/tools/serverBackup.d.ts +24 -0
  135. package/dist/mcp/tools/serverBackup.d.ts.map +1 -0
  136. package/dist/mcp/tools/serverBackup.js +262 -0
  137. package/dist/mcp/tools/serverBackup.js.map +1 -0
  138. package/dist/mcp/tools/serverInfo.d.ts +36 -0
  139. package/dist/mcp/tools/serverInfo.d.ts.map +1 -0
  140. package/dist/mcp/tools/serverInfo.js +283 -0
  141. package/dist/mcp/tools/serverInfo.js.map +1 -0
  142. package/dist/mcp/tools/serverLogs.d.ts +25 -0
  143. package/dist/mcp/tools/serverLogs.d.ts.map +1 -0
  144. package/dist/mcp/tools/serverLogs.js +124 -0
  145. package/dist/mcp/tools/serverLogs.js.map +1 -0
  146. package/dist/mcp/tools/serverMaintain.d.ts +17 -0
  147. package/dist/mcp/tools/serverMaintain.d.ts.map +1 -0
  148. package/dist/mcp/tools/serverMaintain.js +156 -0
  149. package/dist/mcp/tools/serverMaintain.js.map +1 -0
  150. package/dist/mcp/tools/serverManage.d.ts +38 -0
  151. package/dist/mcp/tools/serverManage.d.ts.map +1 -0
  152. package/dist/mcp/tools/serverManage.js +190 -0
  153. package/dist/mcp/tools/serverManage.js.map +1 -0
  154. package/dist/mcp/tools/serverProvision.d.ts +36 -0
  155. package/dist/mcp/tools/serverProvision.d.ts.map +1 -0
  156. package/dist/mcp/tools/serverProvision.js +116 -0
  157. package/dist/mcp/tools/serverProvision.js.map +1 -0
  158. package/dist/mcp/tools/serverSecure.d.ts +35 -0
  159. package/dist/mcp/tools/serverSecure.d.ts.map +1 -0
  160. package/dist/mcp/tools/serverSecure.js +335 -0
  161. package/dist/mcp/tools/serverSecure.js.map +1 -0
  162. package/dist/mcp/utils.d.ts +42 -0
  163. package/dist/mcp/utils.d.ts.map +1 -0
  164. package/dist/mcp/utils.js +61 -0
  165. package/dist/mcp/utils.js.map +1 -0
  166. package/dist/providers/base.d.ts +2 -2
  167. package/dist/providers/base.d.ts.map +1 -1
  168. package/dist/providers/digitalocean.d.ts +2 -2
  169. package/dist/providers/digitalocean.d.ts.map +1 -1
  170. package/dist/providers/digitalocean.js +3 -3
  171. package/dist/providers/digitalocean.js.map +1 -1
  172. package/dist/providers/hetzner.d.ts +2 -2
  173. package/dist/providers/hetzner.d.ts.map +1 -1
  174. package/dist/providers/hetzner.js +7 -4
  175. package/dist/providers/hetzner.js.map +1 -1
  176. package/dist/providers/linode.d.ts +2 -2
  177. package/dist/providers/linode.d.ts.map +1 -1
  178. package/dist/providers/linode.js +2 -2
  179. package/dist/providers/linode.js.map +1 -1
  180. package/dist/providers/vultr.d.ts +2 -2
  181. package/dist/providers/vultr.d.ts.map +1 -1
  182. package/dist/providers/vultr.js +9 -3
  183. package/dist/providers/vultr.js.map +1 -1
  184. package/dist/types/index.d.ts +11 -1
  185. package/dist/types/index.d.ts.map +1 -1
  186. package/dist/utils/cloudInit.d.ts +1 -0
  187. package/dist/utils/cloudInit.d.ts.map +1 -1
  188. package/dist/utils/cloudInit.js +62 -0
  189. package/dist/utils/cloudInit.js.map +1 -1
  190. package/dist/utils/config.js +1 -1
  191. package/dist/utils/config.js.map +1 -1
  192. package/dist/utils/errorMapper.d.ts +1 -0
  193. package/dist/utils/errorMapper.d.ts.map +1 -1
  194. package/dist/utils/errorMapper.js +25 -1
  195. package/dist/utils/errorMapper.js.map +1 -1
  196. package/dist/utils/modeGuard.d.ts +5 -0
  197. package/dist/utils/modeGuard.d.ts.map +1 -0
  198. package/dist/utils/modeGuard.js +13 -0
  199. package/dist/utils/modeGuard.js.map +1 -0
  200. package/dist/utils/openBrowser.d.ts.map +1 -1
  201. package/dist/utils/openBrowser.js +9 -2
  202. package/dist/utils/openBrowser.js.map +1 -1
  203. package/dist/utils/prompts.d.ts +2 -2
  204. package/dist/utils/prompts.d.ts.map +1 -1
  205. package/dist/utils/prompts.js +3 -3
  206. package/dist/utils/prompts.js.map +1 -1
  207. package/dist/utils/ssh.d.ts +10 -0
  208. package/dist/utils/ssh.d.ts.map +1 -1
  209. package/dist/utils/ssh.js +181 -17
  210. package/dist/utils/ssh.js.map +1 -1
  211. package/dist/utils/sshKey.d.ts.map +1 -1
  212. package/dist/utils/sshKey.js +3 -0
  213. package/dist/utils/sshKey.js.map +1 -1
  214. package/package.json +7 -4
@@ -0,0 +1,283 @@
1
+ import { z } from "zod";
2
+ import { getServers, findServer } from "../../utils/config.js";
3
+ import { checkCoolifyHealth, checkServerStatus, checkAllServersStatus } from "../../core/status.js";
4
+ import { getProviderToken, collectProviderTokensFromEnv } from "../../core/tokens.js";
5
+ import { getErrorMessage } from "../../utils/errorMapper.js";
6
+ import { isBareServer } from "../../utils/modeGuard.js";
7
+ import { sshExec } from "../../utils/ssh.js";
8
+ import { createProviderWithToken } from "../../utils/providerFactory.js";
9
+ import { mcpSuccess, mcpError } from "../utils.js";
10
+ export const serverInfoSchema = {
11
+ action: z.enum(["list", "status", "health", "sizes"]).describe("Action to perform: 'list' all servers, 'status' check server/cloud status, 'health' check Coolify reachability (or SSH reachability for bare servers), 'sizes' list available server types with prices for a provider+region"),
12
+ server: z.string().optional().describe("Server name or IP. Required for single-server status/health. Omit for all servers."),
13
+ provider: z.enum(["hetzner", "digitalocean", "vultr", "linode"]).optional().describe("Cloud provider (required for 'sizes' action)"),
14
+ region: z.string().optional().describe("Region/location ID (required for 'sizes' action, e.g. 'nbg1' for Hetzner, 'fra1' for DigitalOcean)"),
15
+ mode: z.enum(["coolify", "bare"]).optional().describe("Server mode filter for 'sizes' action. Coolify requires min 2GB RAM. Default: coolify"),
16
+ };
17
+ function formatServerList(servers) {
18
+ if (servers.length === 0) {
19
+ return {
20
+ servers: [],
21
+ total: 0,
22
+ message: "No servers found. Deploy one with: quicklify init",
23
+ suggested_actions: [
24
+ { command: "quicklify init", reason: "Deploy your first Coolify server" },
25
+ ],
26
+ };
27
+ }
28
+ return {
29
+ servers: servers.map((s) => ({
30
+ name: s.name,
31
+ ip: s.ip,
32
+ provider: s.provider,
33
+ region: s.region,
34
+ size: s.size,
35
+ id: s.id,
36
+ mode: s.mode ?? "coolify",
37
+ createdAt: s.createdAt,
38
+ })),
39
+ total: servers.length,
40
+ suggested_actions: [
41
+ { command: "server_info { action: 'status' }", reason: "Check status of all servers" },
42
+ { command: "server_info { action: 'health' }", reason: "Check health on all servers" },
43
+ ],
44
+ };
45
+ }
46
+ function formatStatusResult(result) {
47
+ return {
48
+ name: result.server.name,
49
+ ip: result.server.ip,
50
+ provider: result.server.provider,
51
+ region: result.server.region,
52
+ size: result.server.size,
53
+ mode: result.server.mode ?? "coolify",
54
+ serverStatus: result.serverStatus,
55
+ coolifyStatus: result.coolifyStatus,
56
+ ...(result.error ? { error: result.error } : {}),
57
+ };
58
+ }
59
+ function formatStatusResults(results) {
60
+ const suggestedActions = [];
61
+ const notReachable = results.filter((r) => r.coolifyStatus === "not reachable");
62
+ if (notReachable.length > 0) {
63
+ for (const r of notReachable) {
64
+ suggestedActions.push({
65
+ command: `quicklify status ${r.server.name} --autostart`,
66
+ reason: `Coolify is not reachable on ${r.server.name}, try auto-restart`,
67
+ });
68
+ }
69
+ }
70
+ const errors = results.filter((r) => r.error);
71
+ if (errors.length > 0) {
72
+ suggestedActions.push({
73
+ command: "quicklify doctor --check-tokens",
74
+ reason: "API errors detected, verify provider tokens",
75
+ });
76
+ }
77
+ if (suggestedActions.length === 0) {
78
+ suggestedActions.push({
79
+ command: "server_logs { action: 'logs' }",
80
+ reason: "All servers healthy, check logs for details",
81
+ });
82
+ }
83
+ return {
84
+ results: results.map(formatStatusResult),
85
+ summary: {
86
+ total: results.length,
87
+ running: results.filter((r) => r.coolifyStatus === "running").length,
88
+ notReachable: notReachable.length,
89
+ errors: errors.length,
90
+ },
91
+ suggested_actions: suggestedActions,
92
+ };
93
+ }
94
+ async function checkBareServerSsh(server) {
95
+ try {
96
+ const result = await sshExec(server.ip, "echo ok");
97
+ return result.code === 0;
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ }
103
+ export async function handleServerInfo(params) {
104
+ try {
105
+ switch (params.action) {
106
+ case "list": {
107
+ const servers = getServers();
108
+ return mcpSuccess(formatServerList(servers));
109
+ }
110
+ case "status": {
111
+ const servers = getServers();
112
+ if (servers.length === 0) {
113
+ return mcpError("No servers found", undefined, [{ command: "quicklify init", reason: "Deploy a server first" }]);
114
+ }
115
+ if (params.server) {
116
+ const server = findServer(params.server);
117
+ if (!server) {
118
+ return {
119
+ content: [{ type: "text", text: JSON.stringify({
120
+ error: `Server not found: ${params.server}`,
121
+ available_servers: servers.map((s) => s.name),
122
+ }) }],
123
+ isError: true,
124
+ };
125
+ }
126
+ const token = server.id.startsWith("manual-") ? "" : (getProviderToken(server.provider) ?? "");
127
+ if (!token && !server.id.startsWith("manual-")) {
128
+ return {
129
+ content: [{ type: "text", text: JSON.stringify({
130
+ error: `No API token found for provider: ${server.provider}`,
131
+ hint: `Set environment variable: ${server.provider.toUpperCase()}_TOKEN`,
132
+ server: { name: server.name, ip: server.ip, provider: server.provider },
133
+ }) }],
134
+ isError: true,
135
+ };
136
+ }
137
+ const result = await checkServerStatus(server, token);
138
+ return mcpSuccess(formatStatusResults([result]));
139
+ }
140
+ // All servers
141
+ const tokenMap = collectProviderTokensFromEnv(servers);
142
+ const missingTokenProviders = [
143
+ ...new Set(servers.filter((s) => !s.id.startsWith("manual-")).map((s) => s.provider)),
144
+ ].filter((p) => !tokenMap.has(p));
145
+ if (missingTokenProviders.length > 0) {
146
+ return {
147
+ content: [{ type: "text", text: JSON.stringify({
148
+ error: "Missing API tokens for providers",
149
+ missing: missingTokenProviders.map((p) => ({
150
+ provider: p,
151
+ envVar: `${p.toUpperCase()}_TOKEN`,
152
+ })),
153
+ hint: "Set environment variables for each provider",
154
+ }) }],
155
+ isError: true,
156
+ };
157
+ }
158
+ const results = await checkAllServersStatus(servers, tokenMap);
159
+ return mcpSuccess(formatStatusResults(results));
160
+ }
161
+ case "health": {
162
+ const servers = getServers();
163
+ if (servers.length === 0) {
164
+ return mcpError("No servers found", undefined, [{ command: "quicklify init", reason: "Deploy a server first" }]);
165
+ }
166
+ if (params.server) {
167
+ const server = findServer(params.server);
168
+ if (!server) {
169
+ return {
170
+ content: [{ type: "text", text: JSON.stringify({
171
+ error: `Server not found: ${params.server}`,
172
+ available_servers: servers.map((s) => s.name),
173
+ }) }],
174
+ isError: true,
175
+ };
176
+ }
177
+ // Bare server: check SSH reachability
178
+ if (isBareServer(server)) {
179
+ const sshReachable = await checkBareServerSsh(server);
180
+ const suggestedActions = sshReachable
181
+ ? [{ command: `ssh root@${server.ip}`, reason: "Connect to your bare server" }]
182
+ : [{ command: `quicklify status ${server.name}`, reason: "Check server cloud status" }];
183
+ return mcpSuccess({
184
+ server: server.name,
185
+ ip: server.ip,
186
+ mode: "bare",
187
+ sshReachable,
188
+ suggested_actions: suggestedActions,
189
+ });
190
+ }
191
+ // Coolify server: check Coolify health
192
+ const status = await checkCoolifyHealth(server.ip);
193
+ const suggestedActions = status === "not reachable"
194
+ ? [{ command: `quicklify status ${server.name} --autostart`, reason: "Try auto-restart Coolify" }]
195
+ : [{ command: `http://${server.ip}:8000`, reason: "Access Coolify dashboard" }];
196
+ return mcpSuccess({
197
+ server: server.name,
198
+ ip: server.ip,
199
+ coolifyStatus: status,
200
+ coolifyUrl: status === "running" ? `http://${server.ip}:8000` : null,
201
+ suggested_actions: suggestedActions,
202
+ });
203
+ }
204
+ // All servers health — route based on mode
205
+ const healthResults = await Promise.all(servers.map(async (s) => {
206
+ if (isBareServer(s)) {
207
+ const sshReachable = await checkBareServerSsh(s);
208
+ return {
209
+ name: s.name,
210
+ ip: s.ip,
211
+ mode: "bare",
212
+ sshReachable,
213
+ };
214
+ }
215
+ return {
216
+ name: s.name,
217
+ ip: s.ip,
218
+ mode: "coolify",
219
+ coolifyStatus: await checkCoolifyHealth(s.ip),
220
+ };
221
+ }));
222
+ const coolifyResults = healthResults.filter((r) => r.mode === "coolify");
223
+ const bareResults = healthResults.filter((r) => r.mode === "bare");
224
+ const notReachableCoolify = coolifyResults.filter((r) => "coolifyStatus" in r && r.coolifyStatus === "not reachable");
225
+ const suggestedActions = notReachableCoolify.length > 0
226
+ ? notReachableCoolify.map((r) => ({
227
+ command: `quicklify status ${r.name} --autostart`,
228
+ reason: `Coolify not reachable on ${r.name}`,
229
+ }))
230
+ : [{ command: "server_info { action: 'status' }", reason: "All healthy, check full status" }];
231
+ return mcpSuccess({
232
+ results: healthResults,
233
+ summary: {
234
+ total: healthResults.length,
235
+ running: coolifyResults.filter((r) => "coolifyStatus" in r && r.coolifyStatus === "running").length,
236
+ notReachable: notReachableCoolify.length,
237
+ bare: bareResults.length,
238
+ },
239
+ suggested_actions: suggestedActions,
240
+ });
241
+ }
242
+ case "sizes": {
243
+ if (!params.provider) {
244
+ return mcpError("Provider is required for 'sizes' action", "Specify provider: 'hetzner', 'digitalocean', 'vultr', or 'linode'");
245
+ }
246
+ if (!params.region) {
247
+ return mcpError("Region is required for 'sizes' action", "Specify region (e.g. 'nbg1' for Hetzner, 'fra1' for DigitalOcean, 'ewr' for Vultr, 'us-east' for Linode)");
248
+ }
249
+ const token = getProviderToken(params.provider);
250
+ if (!token) {
251
+ return mcpError(`No API token found for provider: ${params.provider}`, `Set environment variable: ${params.provider.toUpperCase()}_TOKEN`);
252
+ }
253
+ const provider = createProviderWithToken(params.provider, token);
254
+ const mode = params.mode ?? "coolify";
255
+ const sizes = await provider.getAvailableServerTypes(params.region, mode);
256
+ return mcpSuccess({
257
+ provider: params.provider,
258
+ region: params.region,
259
+ mode,
260
+ sizes: sizes.map((s) => ({
261
+ id: s.id,
262
+ name: s.name,
263
+ vcpu: s.vcpu,
264
+ ram: `${s.ram}GB`,
265
+ disk: `${s.disk}GB`,
266
+ price: s.price,
267
+ })),
268
+ total: sizes.length,
269
+ suggested_actions: [
270
+ {
271
+ command: `server_provision { provider: '${params.provider}', name: 'my-server', region: '${params.region}', size: '${sizes[0]?.id ?? "..."}', mode: '${mode}' }`,
272
+ reason: "Provision a server with one of these sizes",
273
+ },
274
+ ],
275
+ });
276
+ }
277
+ }
278
+ }
279
+ catch (error) {
280
+ return mcpError(getErrorMessage(error));
281
+ }
282
+ }
283
+ //# sourceMappingURL=serverInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverInfo.js","sourceRoot":"","sources":["../../../src/mcp/tools/serverInfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ import { type McpResponse } from "../utils.js";
3
+ import type { LogService } from "../../core/logs.js";
4
+ export declare const serverLogsSchema: {
5
+ action: z.ZodEnum<{
6
+ logs: "logs";
7
+ monitor: "monitor";
8
+ }>;
9
+ server: z.ZodOptional<z.ZodString>;
10
+ service: z.ZodDefault<z.ZodEnum<{
11
+ coolify: "coolify";
12
+ docker: "docker";
13
+ system: "system";
14
+ }>>;
15
+ lines: z.ZodDefault<z.ZodNumber>;
16
+ containers: z.ZodDefault<z.ZodBoolean>;
17
+ };
18
+ export declare function handleServerLogs(params: {
19
+ action: "logs" | "monitor";
20
+ server?: string;
21
+ service?: LogService;
22
+ lines?: number;
23
+ containers?: boolean;
24
+ }): Promise<McpResponse>;
25
+ //# sourceMappingURL=serverLogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverLogs.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/serverLogs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAgB5B,CAAC;AAOF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiIvB"}
@@ -0,0 +1,124 @@
1
+ import { z } from "zod";
2
+ import { getServers } from "../../utils/config.js";
3
+ import { fetchServerLogs, fetchServerMetrics } from "../../core/logs.js";
4
+ import { isBareServer } from "../../utils/modeGuard.js";
5
+ import { resolveServerForMcp, mcpSuccess, mcpError, } from "../utils.js";
6
+ import { getErrorMessage } from "../../utils/errorMapper.js";
7
+ export const serverLogsSchema = {
8
+ action: z.enum(["logs", "monitor"]).describe("Action: 'logs' fetch recent log lines, 'monitor' fetch CPU/RAM/Disk metrics"),
9
+ server: z.string().optional().describe("Server name or IP. Auto-selected if only one server exists."),
10
+ service: z.enum(["coolify", "docker", "system"]).default("coolify").describe("Log source (only for 'logs' action): 'coolify' container (Coolify servers only), 'docker' service journal, 'system' full journal"),
11
+ lines: z.number().min(1).max(500).default(50).describe("Number of log lines to fetch (only for 'logs' action, default: 50, max: 500)"),
12
+ containers: z.boolean().default(false).describe("Include Docker container list in metrics (only for 'monitor' action)"),
13
+ };
14
+ export async function handleServerLogs(params) {
15
+ try {
16
+ const servers = getServers();
17
+ if (servers.length === 0) {
18
+ return mcpError("No servers found", undefined, [
19
+ { command: "quicklify init", reason: "Deploy a server first" },
20
+ ]);
21
+ }
22
+ const server = resolveServerForMcp(params, servers);
23
+ if (!server) {
24
+ if (params.server) {
25
+ return mcpError(`Server not found: ${params.server}`, `Available servers: ${servers.map((s) => s.name).join(", ")}`);
26
+ }
27
+ return mcpError("Multiple servers found. Specify which server to use.", `Available: ${servers.map((s) => s.name).join(", ")}`);
28
+ }
29
+ switch (params.action) {
30
+ case "logs": {
31
+ const service = params.service ?? "coolify";
32
+ const lines = params.lines ?? 50;
33
+ // Guard: bare servers cannot read coolify service logs
34
+ if (isBareServer(server) && service === "coolify") {
35
+ return mcpError("Coolify logs not available on bare servers", "Use service: 'system' or 'docker' for bare servers", [
36
+ {
37
+ command: `server_logs { action: 'logs', server: '${server.name}', service: 'system' }`,
38
+ reason: "View system journal instead",
39
+ },
40
+ ]);
41
+ }
42
+ const result = await fetchServerLogs(server.ip, service, lines);
43
+ if (result.error) {
44
+ return {
45
+ content: [{ type: "text", text: JSON.stringify({
46
+ server: server.name,
47
+ ip: server.ip,
48
+ service,
49
+ error: result.error,
50
+ ...(result.hint ? { hint: result.hint } : {}),
51
+ ...(result.logs ? { partial_logs: result.logs } : {}),
52
+ suggested_actions: [
53
+ { command: `quicklify logs ${server.name} --service ${service}`, reason: "Try from CLI for interactive mode" },
54
+ { command: `server_info { action: 'health', server: '${server.name}' }`, reason: "Check if server is reachable" },
55
+ ],
56
+ }) }],
57
+ isError: true,
58
+ };
59
+ }
60
+ const suggestedActions = [
61
+ { command: `server_logs { action: 'monitor', server: '${server.name}' }`, reason: "Check system metrics" },
62
+ ];
63
+ if (lines < 200) {
64
+ suggestedActions.unshift({
65
+ command: `server_logs { action: 'logs', server: '${server.name}', service: '${service}', lines: 200 }`,
66
+ reason: "Fetch more lines",
67
+ });
68
+ }
69
+ if (service === "coolify") {
70
+ suggestedActions.push({
71
+ command: `server_logs { action: 'logs', server: '${server.name}', service: 'system' }`,
72
+ reason: "Check system journal",
73
+ });
74
+ }
75
+ return mcpSuccess({
76
+ server: server.name,
77
+ ip: server.ip,
78
+ service,
79
+ lines,
80
+ logs: result.logs,
81
+ suggested_actions: suggestedActions,
82
+ });
83
+ }
84
+ case "monitor": {
85
+ const includeContainers = isBareServer(server) ? false : (params.containers ?? false);
86
+ const result = await fetchServerMetrics(server.ip, includeContainers);
87
+ if (result.error) {
88
+ return {
89
+ content: [{ type: "text", text: JSON.stringify({
90
+ server: server.name,
91
+ ip: server.ip,
92
+ error: result.error,
93
+ ...(result.hint ? { hint: result.hint } : {}),
94
+ suggested_actions: [
95
+ { command: `server_info { action: 'health', server: '${server.name}' }`, reason: "Check if server is reachable" },
96
+ ],
97
+ }) }],
98
+ isError: true,
99
+ };
100
+ }
101
+ const suggestedActions = [
102
+ { command: `server_logs { action: 'logs', server: '${server.name}' }`, reason: "Check recent logs" },
103
+ ];
104
+ if (!includeContainers) {
105
+ suggestedActions.unshift({
106
+ command: `server_logs { action: 'monitor', server: '${server.name}', containers: true }`,
107
+ reason: "Include Docker container list",
108
+ });
109
+ }
110
+ return mcpSuccess({
111
+ server: server.name,
112
+ ip: server.ip,
113
+ metrics: result.metrics,
114
+ ...(result.containers ? { containers: result.containers } : {}),
115
+ suggested_actions: suggestedActions,
116
+ });
117
+ }
118
+ }
119
+ }
120
+ catch (error) {
121
+ return mcpError(getErrorMessage(error));
122
+ }
123
+ }
124
+ //# sourceMappingURL=serverLogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverLogs.js","sourceRoot":"","sources":["../../../src/mcp/tools/serverLogs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ import { type McpResponse } from "../utils.js";
3
+ export declare const serverMaintainSchema: {
4
+ action: z.ZodEnum<{
5
+ restart: "restart";
6
+ update: "update";
7
+ maintain: "maintain";
8
+ }>;
9
+ server: z.ZodOptional<z.ZodString>;
10
+ skipReboot: z.ZodDefault<z.ZodBoolean>;
11
+ };
12
+ export declare function handleServerMaintain(params: {
13
+ action: "update" | "restart" | "maintain";
14
+ server?: string;
15
+ skipReboot?: boolean;
16
+ }): Promise<McpResponse>;
17
+ //# sourceMappingURL=serverMaintain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverMaintain.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/serverMaintain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,oBAAoB;;;;;;;;CAUhC,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4LvB"}
@@ -0,0 +1,156 @@
1
+ import { z } from "zod";
2
+ import { getServers } from "../../utils/config.js";
3
+ import { getProviderToken } from "../../core/tokens.js";
4
+ import { isSafeMode } from "../../core/manage.js";
5
+ import { executeCoolifyUpdate, rebootAndWait, maintainServer, } from "../../core/maintain.js";
6
+ import { requireCoolifyMode } from "../../utils/modeGuard.js";
7
+ import { resolveServerForMcp, mcpSuccess, mcpError, } from "../utils.js";
8
+ import { getErrorMessage } from "../../utils/errorMapper.js";
9
+ export const serverMaintainSchema = {
10
+ action: z.enum(["update", "restart", "maintain"]).describe("Action: 'update' runs Coolify update via SSH (Coolify servers only), 'restart' reboots server via cloud provider API (both modes), 'maintain' runs full 5-step maintenance (status → update → health → reboot → final, Coolify servers only)"),
11
+ server: z.string().optional().describe("Server name or IP. Auto-selected if only one server exists."),
12
+ skipReboot: z.boolean().default(false).describe("Skip reboot and final check steps (only for 'maintain' action). Useful during business hours."),
13
+ };
14
+ export async function handleServerMaintain(params) {
15
+ try {
16
+ const servers = getServers();
17
+ if (servers.length === 0) {
18
+ return mcpError("No servers found", undefined, [
19
+ { command: "quicklify init", reason: "Deploy a server first" },
20
+ ]);
21
+ }
22
+ const server = resolveServerForMcp(params, servers);
23
+ if (!server) {
24
+ if (params.server) {
25
+ return mcpError(`Server not found: ${params.server}`, `Available servers: ${servers.map((s) => s.name).join(", ")}`);
26
+ }
27
+ return mcpError("Multiple servers found. Specify which server to use.", `Available: ${servers.map((s) => s.name).join(", ")}`);
28
+ }
29
+ switch (params.action) {
30
+ case "update": {
31
+ // Guard: update requires Coolify
32
+ const modeError = requireCoolifyMode(server, "update");
33
+ if (modeError) {
34
+ return mcpError(modeError, "Use SSH to manage bare servers directly");
35
+ }
36
+ const result = await executeCoolifyUpdate(server.ip);
37
+ if (!result.success) {
38
+ return {
39
+ content: [{ type: "text", text: JSON.stringify({
40
+ server: server.name,
41
+ ip: server.ip,
42
+ error: result.error,
43
+ ...(result.hint ? { hint: result.hint } : {}),
44
+ suggested_actions: [
45
+ { command: `server_info { action: 'health', server: '${server.name}' }`, reason: "Check if server is reachable" },
46
+ ],
47
+ }) }],
48
+ isError: true,
49
+ };
50
+ }
51
+ return mcpSuccess({
52
+ success: true,
53
+ server: server.name,
54
+ ip: server.ip,
55
+ message: "Coolify update completed successfully",
56
+ suggested_actions: [
57
+ { command: `server_info { action: 'health', server: '${server.name}' }`, reason: "Verify Coolify is running after update" },
58
+ { command: `server_logs { action: 'logs', server: '${server.name}' }`, reason: "Check logs after update" },
59
+ ],
60
+ });
61
+ }
62
+ case "restart": {
63
+ if (isSafeMode()) {
64
+ return mcpError("Restart is disabled in SAFE_MODE", "Set QUICKLIFY_SAFE_MODE=false to enable server reboot", [{ command: `server_maintain { action: 'update', server: '${server.name}' }`, reason: "Run Coolify update instead (non-destructive)" }]);
65
+ }
66
+ // Restart requires API token for cloud provider — no mode guard (works on both)
67
+ const isManual = server.id.startsWith("manual-");
68
+ if (isManual) {
69
+ return mcpError("Cannot reboot manually added server via API", `Use SSH: ssh root@${server.ip} reboot`);
70
+ }
71
+ const token = getProviderToken(server.provider);
72
+ if (!token) {
73
+ return mcpError(`No API token found for provider: ${server.provider}`, `Set environment variable: ${server.provider.toUpperCase()}_TOKEN`);
74
+ }
75
+ const result = await rebootAndWait(server, token);
76
+ if (!result.success) {
77
+ return {
78
+ content: [{ type: "text", text: JSON.stringify({
79
+ server: server.name,
80
+ ip: server.ip,
81
+ error: result.error,
82
+ ...(result.hint ? { hint: result.hint } : {}),
83
+ suggested_actions: [
84
+ { command: `server_info { action: 'status', server: '${server.name}' }`, reason: "Check current server status" },
85
+ ],
86
+ }) }],
87
+ isError: true,
88
+ };
89
+ }
90
+ return mcpSuccess({
91
+ success: true,
92
+ server: server.name,
93
+ ip: server.ip,
94
+ message: "Server restarted successfully",
95
+ finalStatus: result.finalStatus,
96
+ suggested_actions: [
97
+ { command: `server_info { action: 'health', server: '${server.name}' }`, reason: "Verify Coolify is accessible" },
98
+ { command: `server_logs { action: 'logs', server: '${server.name}' }`, reason: "Check logs after restart" },
99
+ ],
100
+ });
101
+ }
102
+ case "maintain": {
103
+ // Guard: maintain requires Coolify
104
+ const modeError = requireCoolifyMode(server, "maintain");
105
+ if (modeError) {
106
+ return mcpError(modeError, "Use SSH to manage bare servers directly");
107
+ }
108
+ if (isSafeMode()) {
109
+ return mcpError("Maintenance is disabled in SAFE_MODE", "Set QUICKLIFY_SAFE_MODE=false to enable full maintenance (includes reboot)", [{ command: `server_maintain { action: 'update', server: '${server.name}' }`, reason: "Run Coolify update only (non-destructive)" }]);
110
+ }
111
+ // Maintain requires API token for non-manual servers
112
+ const isManual = server.id.startsWith("manual-");
113
+ let token = "";
114
+ if (!isManual) {
115
+ const envToken = getProviderToken(server.provider);
116
+ if (!envToken) {
117
+ return mcpError(`No API token found for provider: ${server.provider}`, `Set environment variable: ${server.provider.toUpperCase()}_TOKEN`, [{ command: `server_maintain { action: 'update', server: '${server.name}' }`, reason: "Run update only (no token needed)" }]);
118
+ }
119
+ token = envToken;
120
+ }
121
+ const result = await maintainServer(server, token, {
122
+ skipReboot: params.skipReboot ?? false,
123
+ });
124
+ const suggestedActions = [];
125
+ const hasFailure = result.steps.some((s) => s.status === "failure");
126
+ if (hasFailure) {
127
+ suggestedActions.push({ command: `server_info { action: 'health', server: '${server.name}' }`, reason: "Check Coolify reachability" }, { command: `server_logs { action: 'logs', server: '${server.name}' }`, reason: "Check logs for errors" });
128
+ }
129
+ else {
130
+ suggestedActions.push({ command: `server_info { action: 'status', server: '${server.name}' }`, reason: "Verify full server status" }, { command: `server_logs { action: 'logs', server: '${server.name}' }`, reason: "Check Coolify startup logs" });
131
+ }
132
+ return {
133
+ content: [{ type: "text", text: JSON.stringify({
134
+ success: result.success,
135
+ server: result.server,
136
+ ip: result.ip,
137
+ provider: result.provider,
138
+ steps: result.steps,
139
+ summary: {
140
+ total: result.steps.length,
141
+ success: result.steps.filter((s) => s.status === "success").length,
142
+ failure: result.steps.filter((s) => s.status === "failure").length,
143
+ skipped: result.steps.filter((s) => s.status === "skipped").length,
144
+ },
145
+ suggested_actions: suggestedActions,
146
+ }) }],
147
+ ...(hasFailure ? { isError: true } : {}),
148
+ };
149
+ }
150
+ }
151
+ }
152
+ catch (error) {
153
+ return mcpError(getErrorMessage(error));
154
+ }
155
+ }
156
+ //# sourceMappingURL=serverMaintain.js.map