@mseep/mcp-swarmpit 0.1.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.
- package/CLAUDE.md +128 -0
- package/README.md +416 -0
- package/dist/client.d.ts +107 -0
- package/dist/client.js +297 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/sanitize.d.ts +41 -0
- package/dist/sanitize.js +165 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/test/config.test.d.ts +1 -0
- package/dist/test/config.test.js +103 -0
- package/dist/test/config.test.js.map +1 -0
- package/dist/test/file-ref.test.d.ts +1 -0
- package/dist/test/file-ref.test.js +163 -0
- package/dist/test/file-ref.test.js.map +1 -0
- package/dist/test/helpers.test.d.ts +1 -0
- package/dist/test/helpers.test.js +133 -0
- package/dist/test/helpers.test.js.map +1 -0
- package/dist/test/sanitize.test.d.ts +1 -0
- package/dist/test/sanitize.test.js +207 -0
- package/dist/test/sanitize.test.js.map +1 -0
- package/dist/tools/admin.d.ts +3 -0
- package/dist/tools/admin.js +64 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/configs.d.ts +4 -0
- package/dist/tools/configs.js +70 -0
- package/dist/tools/configs.js.map +1 -0
- package/dist/tools/dashboard.d.ts +3 -0
- package/dist/tools/dashboard.js +41 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/helpers.d.ts +16 -0
- package/dist/tools/helpers.js +74 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/networks.d.ts +3 -0
- package/dist/tools/networks.js +70 -0
- package/dist/tools/networks.js.map +1 -0
- package/dist/tools/nodes.d.ts +3 -0
- package/dist/tools/nodes.js +59 -0
- package/dist/tools/nodes.js.map +1 -0
- package/dist/tools/register.d.ts +3 -0
- package/dist/tools/register.js +30 -0
- package/dist/tools/register.js.map +1 -0
- package/dist/tools/secrets.d.ts +4 -0
- package/dist/tools/secrets.js +70 -0
- package/dist/tools/secrets.js.map +1 -0
- package/dist/tools/services.d.ts +4 -0
- package/dist/tools/services.js +198 -0
- package/dist/tools/services.js.map +1 -0
- package/dist/tools/stacks.d.ts +4 -0
- package/dist/tools/stacks.js +196 -0
- package/dist/tools/stacks.js.map +1 -0
- package/dist/tools/tasks.d.ts +3 -0
- package/dist/tools/tasks.js +23 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/timeseries.d.ts +3 -0
- package/dist/tools/timeseries.js +41 -0
- package/dist/tools/timeseries.js.map +1 -0
- package/dist/tools/util.d.ts +3 -0
- package/dist/tools/util.js +10 -0
- package/dist/tools/util.js.map +1 -0
- package/dist/tools/volumes.d.ts +3 -0
- package/dist/tools/volumes.js +59 -0
- package/dist/tools/volumes.js.map +1 -0
- package/dist/types.d.ts +119 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
- package/src/client.ts +391 -0
- package/src/config.ts +57 -0
- package/src/index.ts +49 -0
- package/src/sanitize.ts +218 -0
- package/src/test/config.test.ts +118 -0
- package/src/test/file-ref.test.ts +191 -0
- package/src/test/helpers.test.ts +147 -0
- package/src/test/sanitize.test.ts +234 -0
- package/src/tools/admin.ts +93 -0
- package/src/tools/configs.ts +101 -0
- package/src/tools/dashboard.ts +65 -0
- package/src/tools/helpers.ts +91 -0
- package/src/tools/networks.ts +99 -0
- package/src/tools/nodes.ts +88 -0
- package/src/tools/register.ts +36 -0
- package/src/tools/secrets.ts +101 -0
- package/src/tools/services.ts +283 -0
- package/src/tools/stacks.ts +282 -0
- package/src/tools/tasks.ts +37 -0
- package/src/tools/timeseries.ts +65 -0
- package/src/tools/util.ts +20 -0
- package/src/tools/volumes.ts +88 -0
- package/src/types.ts +131 -0
- package/swagger.json +1 -0
- package/swarmpit-config.example.json +9 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { sanitizeService, sanitizeServices } from "../sanitize.js";
|
|
3
|
+
import { toolResult, toolError, resolveEnvRef, prepareServiceForUpdate } from "./helpers.js";
|
|
4
|
+
export function registerServiceTools(server, client, redact) {
|
|
5
|
+
server.tool("list_services", "List all Docker Swarm services", {}, async () => {
|
|
6
|
+
try {
|
|
7
|
+
const services = await client.listServices();
|
|
8
|
+
return toolResult(redact === "none" ? services : sanitizeServices(services, redact === "all"));
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
return toolError(e);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
server.tool("get_service", "Get detailed info for a specific Docker Swarm service", { id: z.string().describe("Service ID or name") }, async ({ id }) => {
|
|
15
|
+
try {
|
|
16
|
+
const service = await client.getService(id);
|
|
17
|
+
return toolResult(redact === "none" ? service : sanitizeService(service, redact === "all"));
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
return toolError(e);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
server.tool("service_logs", "Get logs for a Docker Swarm service", {
|
|
24
|
+
id: z.string().describe("Service ID or name"),
|
|
25
|
+
since: z.string().optional().describe("Time window as Go duration (e.g. '30s', '5m', '1h', '24h'). Default: 5m"),
|
|
26
|
+
}, async ({ id, since }) => {
|
|
27
|
+
try {
|
|
28
|
+
const logs = await client.getServiceLogs(id, since);
|
|
29
|
+
return toolResult(logs);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
return toolError(e);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
server.tool("create_service", "Create a new Docker Swarm service", { spec: z.record(z.unknown()).describe("Service specification object") }, async ({ spec }) => {
|
|
36
|
+
try {
|
|
37
|
+
const result = await client.createService(spec);
|
|
38
|
+
return toolResult(result);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
return toolError(e);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
server.tool("update_service", "Update an existing Docker Swarm service", {
|
|
45
|
+
id: z.string().describe("Service ID or name"),
|
|
46
|
+
spec: z.record(z.unknown()).describe("Updated service specification"),
|
|
47
|
+
}, async ({ id, spec }) => {
|
|
48
|
+
try {
|
|
49
|
+
await client.updateService(id, spec);
|
|
50
|
+
return toolResult({ updated: true, id });
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return toolError(e);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
server.tool("redeploy_service", "Redeploy a Docker Swarm service, optionally with a new image tag", {
|
|
57
|
+
id: z.string().describe("Service ID or name"),
|
|
58
|
+
tag: z.string().optional().describe("Optional new image tag to deploy"),
|
|
59
|
+
}, async ({ id, tag }) => {
|
|
60
|
+
try {
|
|
61
|
+
await client.redeployService(id, tag);
|
|
62
|
+
return toolResult({ redeployed: true, id, tag: tag ?? "current" });
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return toolError(e);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
server.tool("rollback_service", "Rollback a Docker Swarm service to its previous version", { id: z.string().describe("Service ID or name") }, async ({ id }) => {
|
|
69
|
+
try {
|
|
70
|
+
await client.rollbackService(id);
|
|
71
|
+
return toolResult({ rolledBack: true, id });
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return toolError(e);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
server.tool("scale_service", "Scale a Docker Swarm service to a specific number of replicas", {
|
|
78
|
+
id: z.string().describe("Service ID or name"),
|
|
79
|
+
replicas: z.number().int().min(0).describe("Desired number of replicas"),
|
|
80
|
+
}, async ({ id, replicas }) => {
|
|
81
|
+
try {
|
|
82
|
+
const service = await client.getService(id);
|
|
83
|
+
await client.updateService(id, prepareServiceForUpdate({ ...service, replicas }));
|
|
84
|
+
return toolResult({ scaled: true, id, from: service.replicas, to: replicas });
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
return toolError(e);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
server.tool("list_service_tasks", "List tasks (containers) for a Docker Swarm service", { id: z.string().describe("Service ID or name") }, async ({ id }) => {
|
|
91
|
+
try {
|
|
92
|
+
const tasks = await client.getServiceTasks(id);
|
|
93
|
+
return toolResult(tasks);
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
return toolError(e);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
server.tool("stop_service", "Stop a Docker Swarm service (scale to 0 replicas)", { id: z.string().describe("Service ID or name") }, async ({ id }) => {
|
|
100
|
+
try {
|
|
101
|
+
await client.stopService(id);
|
|
102
|
+
return toolResult({ stopped: true, id });
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return toolError(e);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
server.tool("delete_service", "Delete a Docker Swarm service. DESTRUCTIVE: requires confirm=true", {
|
|
109
|
+
id: z.string().describe("Service ID or name"),
|
|
110
|
+
confirm: z.boolean().describe("Must be true to confirm deletion"),
|
|
111
|
+
}, async ({ id, confirm }) => {
|
|
112
|
+
if (!confirm) {
|
|
113
|
+
return toolError("Destructive operation: set confirm=true to delete this service");
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
await client.deleteService(id);
|
|
117
|
+
return toolResult({ deleted: true, id });
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
return toolError(e);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
server.tool("update_service_env", "Set or remove environment variables on a service. Supports $env references for secret values.", {
|
|
124
|
+
id: z.string().describe("Service ID or name"),
|
|
125
|
+
set: z
|
|
126
|
+
.record(z.union([
|
|
127
|
+
z.string(),
|
|
128
|
+
z.object({ $env: z.string() }).describe('Reference to local env var, e.g. { "$env": "MY_SECRET" }'),
|
|
129
|
+
]))
|
|
130
|
+
.optional()
|
|
131
|
+
.describe("Env vars to set. Values can be plain strings or { $env: VAR_NAME } references"),
|
|
132
|
+
remove: z.array(z.string()).optional().describe("Env var names to remove"),
|
|
133
|
+
}, async ({ id, set, remove }) => {
|
|
134
|
+
try {
|
|
135
|
+
const service = await client.getService(id);
|
|
136
|
+
let variables = [...(service.variables ?? [])];
|
|
137
|
+
if (remove?.length) {
|
|
138
|
+
const removeSet = new Set(remove);
|
|
139
|
+
variables = variables.filter((v) => !removeSet.has(v.name));
|
|
140
|
+
}
|
|
141
|
+
const changedNames = [];
|
|
142
|
+
if (set) {
|
|
143
|
+
for (const [name, rawValue] of Object.entries(set)) {
|
|
144
|
+
const value = resolveEnvRef(rawValue);
|
|
145
|
+
const existing = variables.find((v) => v.name === name);
|
|
146
|
+
if (existing) {
|
|
147
|
+
existing.value = value;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
variables.push({ name, value });
|
|
151
|
+
}
|
|
152
|
+
changedNames.push(name);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
await client.updateService(id, prepareServiceForUpdate({ ...service, variables }));
|
|
156
|
+
return toolResult({ updated: true, id, set: changedNames, removed: remove ?? [] });
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
return toolError(e);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
server.tool("get_service_env", "Get specific environment variable values from a service by name", {
|
|
163
|
+
id: z.string().describe("Service ID or name"),
|
|
164
|
+
names: z.array(z.string()).describe("Env var names to retrieve"),
|
|
165
|
+
}, async ({ id, names }) => {
|
|
166
|
+
try {
|
|
167
|
+
const service = await client.getService(id);
|
|
168
|
+
const found = {};
|
|
169
|
+
for (const name of names) {
|
|
170
|
+
const v = service.variables?.find((v) => v.name === name);
|
|
171
|
+
found[name] = v?.value ?? null;
|
|
172
|
+
}
|
|
173
|
+
return toolResult(found);
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
return toolError(e);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
server.tool("get_service_compose", "Get the compose YAML for a specific service", { id: z.string().describe("Service ID or name") }, async ({ id }) => {
|
|
180
|
+
try {
|
|
181
|
+
const compose = await client.getServiceCompose(id);
|
|
182
|
+
return toolResult(compose);
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
return toolError(e);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
server.tool("get_service_networks", "Get networks attached to a specific service", { id: z.string().describe("Service ID or name") }, async ({ id }) => {
|
|
189
|
+
try {
|
|
190
|
+
const networks = await client.getServiceNetworks(id);
|
|
191
|
+
return toolResult(networks);
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
return toolError(e);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/tools/services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { RedactMode } from "../config.js";
|
|
3
|
+
import { SwarmpitClient } from "../client.js";
|
|
4
|
+
export declare function registerStackTools(server: McpServer, client: SwarmpitClient, redact: RedactMode): void;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { sanitizeServices, sanitizeComposeYaml, resolveComposeEnvRefs, restoreRedactedValues } from "../sanitize.js";
|
|
3
|
+
import { toolResult, toolError, resolveData } from "./helpers.js";
|
|
4
|
+
export function registerStackTools(server, client, redact) {
|
|
5
|
+
server.tool("list_stacks", "List all Docker Swarm stacks", {}, async () => {
|
|
6
|
+
try {
|
|
7
|
+
const stacks = await client.listStacks();
|
|
8
|
+
return toolResult(stacks);
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
return toolError(e);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
server.tool("get_stack", "Get stack details including services and compose file", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
15
|
+
try {
|
|
16
|
+
const [services, file] = await Promise.all([
|
|
17
|
+
client.getStackServices(name),
|
|
18
|
+
client.getStackFile(name).catch(() => ({ compose: "" })),
|
|
19
|
+
]);
|
|
20
|
+
if (redact === "none") {
|
|
21
|
+
return toolResult({ name, services, compose: file.compose });
|
|
22
|
+
}
|
|
23
|
+
const redactAll = redact === "all";
|
|
24
|
+
return toolResult({
|
|
25
|
+
name,
|
|
26
|
+
services: sanitizeServices(services, redactAll),
|
|
27
|
+
compose: sanitizeComposeYaml(file.compose, redactAll),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
return toolError(e);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
const composeInput = z.union([
|
|
35
|
+
z.string(),
|
|
36
|
+
z.object({ $file: z.string() }).describe('Read compose from local file path'),
|
|
37
|
+
]);
|
|
38
|
+
server.tool("create_stack", "Create a new Docker Swarm stack from compose YAML. Use $env:VAR_NAME for secret values, or { $file: /path } to read from a local file.", {
|
|
39
|
+
name: z.string().describe("Stack name"),
|
|
40
|
+
compose: composeInput.describe("Compose YAML string or { $file: /path }"),
|
|
41
|
+
}, async ({ name, compose }) => {
|
|
42
|
+
try {
|
|
43
|
+
const yaml = resolveData(compose);
|
|
44
|
+
const resolved = resolveComposeEnvRefs(yaml);
|
|
45
|
+
await client.createStack({ name, spec: { compose: resolved } });
|
|
46
|
+
return toolResult({ created: true, name });
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
return toolError(e);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
server.tool("update_stack", "Update a Docker Swarm stack. [REDACTED] values are preserved. Use $env:VAR_NAME for new secrets, or { $file: /path } to read from a local file.", {
|
|
53
|
+
name: z.string().describe("Stack name"),
|
|
54
|
+
compose: composeInput.describe("Compose YAML string or { $file: /path }. Leave [REDACTED] for unchanged secrets."),
|
|
55
|
+
}, async ({ name, compose }) => {
|
|
56
|
+
try {
|
|
57
|
+
const yaml = resolveData(compose);
|
|
58
|
+
const current = await client.getStackFile(name).catch(() => ({ compose: "" }));
|
|
59
|
+
const restored = restoreRedactedValues(yaml, current.compose);
|
|
60
|
+
const resolved = resolveComposeEnvRefs(restored);
|
|
61
|
+
await client.updateStack(name, resolved);
|
|
62
|
+
return toolResult({ updated: true, name });
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return toolError(e);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
server.tool("redeploy_stack", "Redeploy all services in a Docker Swarm stack", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
69
|
+
try {
|
|
70
|
+
await client.redeployStack(name);
|
|
71
|
+
return toolResult({ redeployed: true, name });
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return toolError(e);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
server.tool("rollback_stack", "Rollback all services in a Docker Swarm stack to their previous version", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
78
|
+
try {
|
|
79
|
+
await client.rollbackStack(name);
|
|
80
|
+
return toolResult({ rolledBack: true, name });
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
return toolError(e);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
server.tool("deactivate_stack", "Deactivate (stop) all services in a Docker Swarm stack", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
87
|
+
try {
|
|
88
|
+
await client.deactivateStack(name);
|
|
89
|
+
return toolResult({ deactivated: true, name });
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
return toolError(e);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
server.tool("delete_stack", "Delete a Docker Swarm stack. DESTRUCTIVE: requires confirm=true", {
|
|
96
|
+
name: z.string().describe("Stack name"),
|
|
97
|
+
confirm: z.boolean().describe("Must be true to confirm deletion"),
|
|
98
|
+
}, async ({ name, confirm }) => {
|
|
99
|
+
if (!confirm) {
|
|
100
|
+
return toolError("Destructive operation: set confirm=true to delete this stack");
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
await client.deleteStack(name);
|
|
104
|
+
return toolResult({ deleted: true, name });
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
return toolError(e);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
server.tool("get_stack_tasks", "List all tasks (containers) in a stack", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
111
|
+
try {
|
|
112
|
+
const tasks = await client.getStackTasks(name);
|
|
113
|
+
return toolResult(tasks);
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
return toolError(e);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
server.tool("get_stack_volumes", "List all volumes in a stack", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
120
|
+
try {
|
|
121
|
+
const volumes = await client.getStackVolumes(name);
|
|
122
|
+
return toolResult(volumes);
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
return toolError(e);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
server.tool("get_stack_networks", "List all networks in a stack", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
129
|
+
try {
|
|
130
|
+
const networks = await client.getStackNetworks(name);
|
|
131
|
+
return toolResult(networks);
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
return toolError(e);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
server.tool("get_stack_compose", "Get the generated compose YAML for a stack", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
138
|
+
try {
|
|
139
|
+
const compose = await client.getStackCompose(name);
|
|
140
|
+
if (redact === "none")
|
|
141
|
+
return toolResult(compose);
|
|
142
|
+
return toolResult({ compose: sanitizeComposeYaml(compose.compose, redact === "all") });
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
return toolError(e);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
server.tool("get_stack_secrets", "List all secrets in a stack", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
149
|
+
try {
|
|
150
|
+
const secrets = await client.getStackSecrets(name);
|
|
151
|
+
return toolResult(secrets);
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
return toolError(e);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
server.tool("get_stack_configs", "List all configs in a stack", { name: z.string().describe("Stack name") }, async ({ name }) => {
|
|
158
|
+
try {
|
|
159
|
+
const configs = await client.getStackConfigs(name);
|
|
160
|
+
return toolResult(configs);
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
return toolError(e);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
server.tool("create_stack_file", "Upload/create a compose file for a stack. Accepts a string or { $file: /path }.", {
|
|
167
|
+
name: z.string().describe("Stack name"),
|
|
168
|
+
compose: composeInput.describe("Compose YAML string or { $file: /path }"),
|
|
169
|
+
}, async ({ name, compose }) => {
|
|
170
|
+
try {
|
|
171
|
+
const yaml = resolveData(compose);
|
|
172
|
+
const resolved = resolveComposeEnvRefs(yaml);
|
|
173
|
+
await client.createStackFile(name, resolved);
|
|
174
|
+
return toolResult({ created: true, name });
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
return toolError(e);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
server.tool("delete_stack_file", "Delete the compose file for a stack. DESTRUCTIVE: requires confirm=true", {
|
|
181
|
+
name: z.string().describe("Stack name"),
|
|
182
|
+
confirm: z.boolean().describe("Must be true to confirm deletion"),
|
|
183
|
+
}, async ({ name, confirm }) => {
|
|
184
|
+
if (!confirm) {
|
|
185
|
+
return toolError("Destructive operation: set confirm=true to delete this stack file");
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
await client.deleteStackFile(name);
|
|
189
|
+
return toolResult({ deleted: true, name });
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
return toolError(e);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=stacks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../src/tools/stacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult, toolError } from "./helpers.js";
|
|
3
|
+
export function registerTaskTools(server, client) {
|
|
4
|
+
server.tool("list_tasks", "List all Docker Swarm tasks across all services", {}, async () => {
|
|
5
|
+
try {
|
|
6
|
+
const tasks = await client.listTasks();
|
|
7
|
+
return toolResult(tasks);
|
|
8
|
+
}
|
|
9
|
+
catch (e) {
|
|
10
|
+
return toolError(e);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
server.tool("get_task", "Get details of a specific Docker Swarm task", { id: z.string().describe("Task ID") }, async ({ id }) => {
|
|
14
|
+
try {
|
|
15
|
+
const task = await client.getTask(id);
|
|
16
|
+
return toolResult(task);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
return toolError(e);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,iDAAiD,EACjD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YACvC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,UAAU,EACV,6CAA6C,EAC7C,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EACtC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult, toolError } from "./helpers.js";
|
|
3
|
+
export function registerTimeseriesTools(server, client) {
|
|
4
|
+
server.tool("get_nodes_timeseries", "Get timeseries data for all nodes (CPU, memory, disk over time)", {}, async () => {
|
|
5
|
+
try {
|
|
6
|
+
const ts = await client.getNodesTimeseries();
|
|
7
|
+
return toolResult(ts);
|
|
8
|
+
}
|
|
9
|
+
catch (e) {
|
|
10
|
+
return toolError(e);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
server.tool("get_services_cpu_timeseries", "Get CPU usage timeseries for all services", {}, async () => {
|
|
14
|
+
try {
|
|
15
|
+
const ts = await client.getServicesCpuTimeseries();
|
|
16
|
+
return toolResult(ts);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
return toolError(e);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
server.tool("get_services_memory_timeseries", "Get memory usage timeseries for all services", {}, async () => {
|
|
23
|
+
try {
|
|
24
|
+
const ts = await client.getServicesMemoryTimeseries();
|
|
25
|
+
return toolResult(ts);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
return toolError(e);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
server.tool("get_task_timeseries", "Get timeseries data for a specific task", { name: z.string().describe("Task name") }, async ({ name }) => {
|
|
32
|
+
try {
|
|
33
|
+
const ts = await client.getTaskTimeseries(name);
|
|
34
|
+
return toolResult(ts);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
return toolError(e);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=timeseries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeseries.js","sourceRoot":"","sources":["../../src/tools/timeseries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,iEAAiE,EACjE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC7C,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,2CAA2C,EAC3C,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,EAAE,CAAC;YACnD,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gCAAgC,EAChC,8CAA8C,EAC9C,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACtD,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,yCAAyC,EACzC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAC1C,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { toolResult } from "./helpers.js";
|
|
2
|
+
export function registerUtilTools(server, config) {
|
|
3
|
+
server.tool("swarmpit_info", "Show the connected Swarmpit instance URL and redaction mode", {}, async () => {
|
|
4
|
+
return toolResult({
|
|
5
|
+
url: config.url,
|
|
6
|
+
redact: config.redact,
|
|
7
|
+
});
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/tools/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,6DAA6D,EAC7D,EAAE,EACF,KAAK,IAAI,EAAE;QACT,OAAO,UAAU,CAAC;YAChB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult, toolError } from "./helpers.js";
|
|
3
|
+
export function registerVolumeTools(server, client) {
|
|
4
|
+
server.tool("list_volumes", "List all Docker Swarm volumes", {}, async () => {
|
|
5
|
+
try {
|
|
6
|
+
const volumes = await client.listVolumes();
|
|
7
|
+
return toolResult(volumes);
|
|
8
|
+
}
|
|
9
|
+
catch (e) {
|
|
10
|
+
return toolError(e);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
server.tool("get_volume", "Get details of a specific Docker Swarm volume", { name: z.string().describe("Volume name") }, async ({ name }) => {
|
|
14
|
+
try {
|
|
15
|
+
const volume = await client.getVolume(name);
|
|
16
|
+
return toolResult(volume);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
return toolError(e);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
server.tool("create_volume", "Create a Docker Swarm volume", {
|
|
23
|
+
volumeName: z.string().describe("Volume name"),
|
|
24
|
+
driver: z.string().default("local").describe("Volume driver (default: local)"),
|
|
25
|
+
}, async ({ volumeName, driver }) => {
|
|
26
|
+
try {
|
|
27
|
+
await client.createVolume({ volumeName, driver, options: [] });
|
|
28
|
+
return toolResult({ created: true, volumeName });
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
return toolError(e);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
server.tool("delete_volume", "Delete a Docker Swarm volume. DESTRUCTIVE: requires confirm=true", {
|
|
35
|
+
name: z.string().describe("Volume name"),
|
|
36
|
+
confirm: z.boolean().describe("Must be true to confirm deletion"),
|
|
37
|
+
}, async ({ name, confirm }) => {
|
|
38
|
+
if (!confirm) {
|
|
39
|
+
return toolError("Destructive operation: set confirm=true to delete this volume");
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
await client.deleteVolume(name);
|
|
43
|
+
return toolResult({ deleted: true, name });
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
return toolError(e);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
server.tool("get_volume_services", "List services using a specific volume", { name: z.string().describe("Volume name") }, async ({ name }) => {
|
|
50
|
+
try {
|
|
51
|
+
const services = await client.getVolumeServices(name);
|
|
52
|
+
return toolResult(services);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
return toolError(e);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=volumes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volumes.js","sourceRoot":"","sources":["../../src/tools/volumes.ts"],"names":[],"mappings":"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"}
|