@hypnosis/docker-mcp-server 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.
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/adapters/adapter-registry.d.ts +29 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +47 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/database-adapter.d.ts +33 -0
- package/dist/adapters/database-adapter.d.ts.map +1 -0
- package/dist/adapters/database-adapter.js +6 -0
- package/dist/adapters/database-adapter.js.map +1 -0
- package/dist/adapters/postgresql.d.ts +42 -0
- package/dist/adapters/postgresql.d.ts.map +1 -0
- package/dist/adapters/postgresql.js +202 -0
- package/dist/adapters/postgresql.js.map +1 -0
- package/dist/adapters/redis.d.ts +46 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +202 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/adapters/sqlite.d.ts +34 -0
- package/dist/adapters/sqlite.d.ts.map +1 -0
- package/dist/adapters/sqlite.js +126 -0
- package/dist/adapters/sqlite.js.map +1 -0
- package/dist/adapters/types.d.ts +53 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +5 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +319 -0
- package/dist/cli.js.map +1 -0
- package/dist/discovery/compose-parser.d.ts +35 -0
- package/dist/discovery/compose-parser.d.ts.map +1 -0
- package/dist/discovery/compose-parser.js +126 -0
- package/dist/discovery/compose-parser.js.map +1 -0
- package/dist/discovery/config-merger.d.ts +19 -0
- package/dist/discovery/config-merger.d.ts.map +1 -0
- package/dist/discovery/config-merger.js +60 -0
- package/dist/discovery/config-merger.js.map +1 -0
- package/dist/discovery/project-discovery.d.ts +53 -0
- package/dist/discovery/project-discovery.d.ts.map +1 -0
- package/dist/discovery/project-discovery.js +252 -0
- package/dist/discovery/project-discovery.js.map +1 -0
- package/dist/discovery/types.d.ts +47 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +6 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/compose-manager.d.ts +30 -0
- package/dist/managers/compose-manager.d.ts.map +1 -0
- package/dist/managers/compose-manager.js +70 -0
- package/dist/managers/compose-manager.js.map +1 -0
- package/dist/managers/container-manager.d.ts +81 -0
- package/dist/managers/container-manager.d.ts.map +1 -0
- package/dist/managers/container-manager.js +278 -0
- package/dist/managers/container-manager.js.map +1 -0
- package/dist/managers/env-manager.d.ts +37 -0
- package/dist/managers/env-manager.d.ts.map +1 -0
- package/dist/managers/env-manager.js +124 -0
- package/dist/managers/env-manager.js.map +1 -0
- package/dist/security/sql-validator.d.ts +23 -0
- package/dist/security/sql-validator.d.ts.map +1 -0
- package/dist/security/sql-validator.js +44 -0
- package/dist/security/sql-validator.js.map +1 -0
- package/dist/tools/container-tools.d.ts +31 -0
- package/dist/tools/container-tools.d.ts.map +1 -0
- package/dist/tools/container-tools.js +366 -0
- package/dist/tools/container-tools.js.map +1 -0
- package/dist/tools/database-tools.d.ts +22 -0
- package/dist/tools/database-tools.d.ts.map +1 -0
- package/dist/tools/database-tools.js +264 -0
- package/dist/tools/database-tools.js.map +1 -0
- package/dist/tools/env-tools.d.ts +52 -0
- package/dist/tools/env-tools.d.ts.map +1 -0
- package/dist/tools/env-tools.js +318 -0
- package/dist/tools/env-tools.js.map +1 -0
- package/dist/tools/executor-tool.d.ts +18 -0
- package/dist/tools/executor-tool.d.ts.map +1 -0
- package/dist/tools/executor-tool.js +95 -0
- package/dist/tools/executor-tool.js.map +1 -0
- package/dist/tools/mcp-health-tool.d.ts +65 -0
- package/dist/tools/mcp-health-tool.d.ts.map +1 -0
- package/dist/tools/mcp-health-tool.js +126 -0
- package/dist/tools/mcp-health-tool.js.map +1 -0
- package/dist/utils/cache.d.ts +43 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +77 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/compose-exec.d.ts +13 -0
- package/dist/utils/compose-exec.d.ts.map +1 -0
- package/dist/utils/compose-exec.js +33 -0
- package/dist/utils/compose-exec.js.map +1 -0
- package/dist/utils/docker-client.d.ts +33 -0
- package/dist/utils/docker-client.d.ts.map +1 -0
- package/dist/utils/docker-client.js +59 -0
- package/dist/utils/docker-client.js.map +1 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Tools
|
|
3
|
+
* MCP Tools для управления Docker контейнерами
|
|
4
|
+
*/
|
|
5
|
+
import { ContainerManager } from '../managers/container-manager.js';
|
|
6
|
+
import { ComposeManager } from '../managers/compose-manager.js';
|
|
7
|
+
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
export class ContainerTools {
|
|
10
|
+
containerManager;
|
|
11
|
+
composeManager;
|
|
12
|
+
projectDiscovery;
|
|
13
|
+
constructor() {
|
|
14
|
+
this.containerManager = new ContainerManager();
|
|
15
|
+
this.composeManager = new ComposeManager();
|
|
16
|
+
this.projectDiscovery = new ProjectDiscovery();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Регистрация всех container tools
|
|
20
|
+
*/
|
|
21
|
+
getTools() {
|
|
22
|
+
return [
|
|
23
|
+
{
|
|
24
|
+
name: 'docker_container_list',
|
|
25
|
+
description: 'List all containers in the current project',
|
|
26
|
+
inputSchema: {
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: {
|
|
29
|
+
project: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'Project name (auto-detected if not provided)',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'docker_container_start',
|
|
38
|
+
description: 'Start a stopped container',
|
|
39
|
+
inputSchema: {
|
|
40
|
+
type: 'object',
|
|
41
|
+
properties: {
|
|
42
|
+
service: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
description: 'Service name from docker-compose.yml',
|
|
45
|
+
},
|
|
46
|
+
project: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: 'Project name (auto-detected if not provided)',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
required: ['service'],
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'docker_container_stop',
|
|
56
|
+
description: 'Stop a running container',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
service: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'Service name from docker-compose.yml',
|
|
63
|
+
},
|
|
64
|
+
project: {
|
|
65
|
+
type: 'string',
|
|
66
|
+
description: 'Project name (auto-detected if not provided)',
|
|
67
|
+
},
|
|
68
|
+
timeout: {
|
|
69
|
+
type: 'number',
|
|
70
|
+
description: 'Timeout in seconds',
|
|
71
|
+
default: 10,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
required: ['service'],
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'docker_container_restart',
|
|
79
|
+
description: 'Restart a container',
|
|
80
|
+
inputSchema: {
|
|
81
|
+
type: 'object',
|
|
82
|
+
properties: {
|
|
83
|
+
service: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
description: 'Service name from docker-compose.yml',
|
|
86
|
+
},
|
|
87
|
+
project: {
|
|
88
|
+
type: 'string',
|
|
89
|
+
description: 'Project name (auto-detected if not provided)',
|
|
90
|
+
},
|
|
91
|
+
timeout: {
|
|
92
|
+
type: 'number',
|
|
93
|
+
description: 'Timeout in seconds',
|
|
94
|
+
default: 10,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
required: ['service'],
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'docker_container_logs',
|
|
102
|
+
description: 'View container logs',
|
|
103
|
+
inputSchema: {
|
|
104
|
+
type: 'object',
|
|
105
|
+
properties: {
|
|
106
|
+
service: {
|
|
107
|
+
type: 'string',
|
|
108
|
+
description: 'Service name from docker-compose.yml',
|
|
109
|
+
},
|
|
110
|
+
project: {
|
|
111
|
+
type: 'string',
|
|
112
|
+
description: 'Project name (auto-detected if not provided)',
|
|
113
|
+
},
|
|
114
|
+
lines: {
|
|
115
|
+
type: 'number',
|
|
116
|
+
description: 'Number of lines to show',
|
|
117
|
+
default: 100,
|
|
118
|
+
},
|
|
119
|
+
timestamps: {
|
|
120
|
+
type: 'boolean',
|
|
121
|
+
description: 'Show timestamps',
|
|
122
|
+
default: false,
|
|
123
|
+
},
|
|
124
|
+
follow: {
|
|
125
|
+
type: 'boolean',
|
|
126
|
+
description: 'Follow log output (stream)',
|
|
127
|
+
default: false,
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
required: ['service'],
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'docker_compose_up',
|
|
135
|
+
description: 'Start all services defined in docker-compose.yml',
|
|
136
|
+
inputSchema: {
|
|
137
|
+
type: 'object',
|
|
138
|
+
properties: {
|
|
139
|
+
build: {
|
|
140
|
+
type: 'boolean',
|
|
141
|
+
description: 'Build images before starting',
|
|
142
|
+
default: false,
|
|
143
|
+
},
|
|
144
|
+
detach: {
|
|
145
|
+
type: 'boolean',
|
|
146
|
+
description: 'Run in background',
|
|
147
|
+
default: true,
|
|
148
|
+
},
|
|
149
|
+
services: {
|
|
150
|
+
type: 'array',
|
|
151
|
+
items: { type: 'string' },
|
|
152
|
+
description: 'Start only specific services',
|
|
153
|
+
},
|
|
154
|
+
scale: {
|
|
155
|
+
type: 'object',
|
|
156
|
+
description: 'Scale services (e.g., {"web": 3})',
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: 'docker_compose_down',
|
|
163
|
+
description: 'Stop and remove all containers',
|
|
164
|
+
inputSchema: {
|
|
165
|
+
type: 'object',
|
|
166
|
+
properties: {
|
|
167
|
+
volumes: {
|
|
168
|
+
type: 'boolean',
|
|
169
|
+
description: 'Remove volumes',
|
|
170
|
+
default: false,
|
|
171
|
+
},
|
|
172
|
+
removeOrphans: {
|
|
173
|
+
type: 'boolean',
|
|
174
|
+
description: 'Remove orphaned containers',
|
|
175
|
+
default: false,
|
|
176
|
+
},
|
|
177
|
+
timeout: {
|
|
178
|
+
type: 'number',
|
|
179
|
+
description: 'Shutdown timeout in seconds',
|
|
180
|
+
default: 10,
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
];
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Обработка вызова tool
|
|
189
|
+
*/
|
|
190
|
+
async handleCall(request) {
|
|
191
|
+
const { name, arguments: args } = request.params;
|
|
192
|
+
try {
|
|
193
|
+
switch (name) {
|
|
194
|
+
case 'docker_container_list':
|
|
195
|
+
return await this.handleList(args);
|
|
196
|
+
case 'docker_container_start':
|
|
197
|
+
return await this.handleStart(args);
|
|
198
|
+
case 'docker_container_stop':
|
|
199
|
+
return await this.handleStop(args);
|
|
200
|
+
case 'docker_container_restart':
|
|
201
|
+
return await this.handleRestart(args);
|
|
202
|
+
case 'docker_container_logs':
|
|
203
|
+
return await this.handleLogs(args);
|
|
204
|
+
case 'docker_compose_up':
|
|
205
|
+
return await this.handleComposeUp(args);
|
|
206
|
+
case 'docker_compose_down':
|
|
207
|
+
return await this.handleComposeDown(args);
|
|
208
|
+
default:
|
|
209
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
logger.error(`Tool ${name} failed:`, error);
|
|
214
|
+
return {
|
|
215
|
+
content: [
|
|
216
|
+
{
|
|
217
|
+
type: 'text',
|
|
218
|
+
text: `Error: ${error.message}`,
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
isError: true,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async handleList(args) {
|
|
226
|
+
const project = await this.getProject(args?.project);
|
|
227
|
+
const containers = await this.containerManager.listContainers(project.name, project.composeFile, project.projectDir);
|
|
228
|
+
return {
|
|
229
|
+
content: [
|
|
230
|
+
{
|
|
231
|
+
type: 'text',
|
|
232
|
+
text: JSON.stringify(containers, null, 2),
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
async handleStart(args) {
|
|
238
|
+
if (!args.service) {
|
|
239
|
+
throw new Error('service parameter is required');
|
|
240
|
+
}
|
|
241
|
+
const project = await this.getProject(args?.project);
|
|
242
|
+
await this.containerManager.startContainer(args.service, project.name, project.composeFile, project.projectDir);
|
|
243
|
+
return {
|
|
244
|
+
content: [
|
|
245
|
+
{
|
|
246
|
+
type: 'text',
|
|
247
|
+
text: `✅ Container '${args.service}' started successfully`,
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
async handleStop(args) {
|
|
253
|
+
if (!args.service) {
|
|
254
|
+
throw new Error('service parameter is required');
|
|
255
|
+
}
|
|
256
|
+
const project = await this.getProject(args?.project);
|
|
257
|
+
await this.containerManager.stopContainer(args.service, project.name, args?.timeout || 10, project.composeFile, project.projectDir);
|
|
258
|
+
return {
|
|
259
|
+
content: [
|
|
260
|
+
{
|
|
261
|
+
type: 'text',
|
|
262
|
+
text: `✅ Container '${args.service}' stopped successfully`,
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
async handleRestart(args) {
|
|
268
|
+
if (!args.service) {
|
|
269
|
+
throw new Error('service parameter is required');
|
|
270
|
+
}
|
|
271
|
+
const project = await this.getProject(args?.project);
|
|
272
|
+
await this.containerManager.restartContainer(args.service, project.name, args?.timeout || 10, project.composeFile, project.projectDir);
|
|
273
|
+
return {
|
|
274
|
+
content: [
|
|
275
|
+
{
|
|
276
|
+
type: 'text',
|
|
277
|
+
text: `✅ Container '${args.service}' restarted successfully`,
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
async handleLogs(args) {
|
|
283
|
+
if (!args.service) {
|
|
284
|
+
throw new Error('service parameter is required');
|
|
285
|
+
}
|
|
286
|
+
const project = await this.getProject(args?.project);
|
|
287
|
+
const logs = await this.containerManager.getLogs(args.service, project.name, {
|
|
288
|
+
lines: args?.lines || 100,
|
|
289
|
+
timestamps: args?.timestamps || false,
|
|
290
|
+
follow: args?.follow || false,
|
|
291
|
+
}, project.composeFile, project.projectDir);
|
|
292
|
+
// Если это stream (follow mode), собираем данные из stream
|
|
293
|
+
if (args?.follow && typeof logs !== 'string') {
|
|
294
|
+
const stream = logs;
|
|
295
|
+
const chunks = [];
|
|
296
|
+
return new Promise((resolve, reject) => {
|
|
297
|
+
stream.on('data', (chunk) => {
|
|
298
|
+
chunks.push(chunk);
|
|
299
|
+
});
|
|
300
|
+
stream.on('end', () => {
|
|
301
|
+
const output = Buffer.concat(chunks).toString('utf-8');
|
|
302
|
+
resolve({
|
|
303
|
+
content: [
|
|
304
|
+
{
|
|
305
|
+
type: 'text',
|
|
306
|
+
text: output,
|
|
307
|
+
},
|
|
308
|
+
],
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
stream.on('error', (error) => {
|
|
312
|
+
reject(error);
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
// Обычный режим (string)
|
|
317
|
+
return {
|
|
318
|
+
content: [
|
|
319
|
+
{
|
|
320
|
+
type: 'text',
|
|
321
|
+
text: logs,
|
|
322
|
+
},
|
|
323
|
+
],
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
async handleComposeUp(args) {
|
|
327
|
+
await this.composeManager.composeUp({
|
|
328
|
+
build: args?.build || false,
|
|
329
|
+
detach: args?.detach !== false, // default: true
|
|
330
|
+
services: args?.services,
|
|
331
|
+
scale: args?.scale,
|
|
332
|
+
});
|
|
333
|
+
return {
|
|
334
|
+
content: [
|
|
335
|
+
{
|
|
336
|
+
type: 'text',
|
|
337
|
+
text: '✅ All services started successfully',
|
|
338
|
+
},
|
|
339
|
+
],
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
async handleComposeDown(args) {
|
|
343
|
+
await this.composeManager.composeDown({
|
|
344
|
+
volumes: args?.volumes || false,
|
|
345
|
+
removeOrphans: args?.removeOrphans || false,
|
|
346
|
+
timeout: args?.timeout || 10,
|
|
347
|
+
});
|
|
348
|
+
return {
|
|
349
|
+
content: [
|
|
350
|
+
{
|
|
351
|
+
type: 'text',
|
|
352
|
+
text: '✅ All services stopped successfully',
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Helper: получить project config (auto-detect или explicit)
|
|
359
|
+
*/
|
|
360
|
+
async getProject(explicitName) {
|
|
361
|
+
// Пока используем auto-detect всегда
|
|
362
|
+
// В будущем можно добавить кеширование по explicit name
|
|
363
|
+
return this.projectDiscovery.findProject();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=container-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-tools.js","sourceRoot":"","sources":["../../src/tools/container-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Tools
|
|
3
|
+
* MCP Tools для работы с базами данных
|
|
4
|
+
*/
|
|
5
|
+
import { CallToolRequest, Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
export declare class DatabaseTools {
|
|
7
|
+
private projectDiscovery;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Регистрация всех database tools
|
|
11
|
+
*/
|
|
12
|
+
getTools(): Tool[];
|
|
13
|
+
/**
|
|
14
|
+
* Обработка вызова tool
|
|
15
|
+
*/
|
|
16
|
+
handleCall(request: CallToolRequest): Promise<any>;
|
|
17
|
+
private handleQuery;
|
|
18
|
+
private handleBackup;
|
|
19
|
+
private handleRestore;
|
|
20
|
+
private handleStatus;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=database-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-tools.d.ts","sourceRoot":"","sources":["../../src/tools/database-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,IAAI,EACL,MAAM,oCAAoC,CAAC;AAK5C,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAmB;;IAM3C;;OAEG;IACH,QAAQ,IAAI,IAAI,EAAE;IAyHlB;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;YAkC1C,WAAW;YA+BX,YAAY;YA+BZ,aAAa;YA+Bb,YAAY;CAyB3B"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Tools
|
|
3
|
+
* MCP Tools для работы с базами данных
|
|
4
|
+
*/
|
|
5
|
+
import { adapterRegistry } from '../adapters/adapter-registry.js';
|
|
6
|
+
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
export class DatabaseTools {
|
|
9
|
+
projectDiscovery;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.projectDiscovery = new ProjectDiscovery();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Регистрация всех database tools
|
|
15
|
+
*/
|
|
16
|
+
getTools() {
|
|
17
|
+
return [
|
|
18
|
+
{
|
|
19
|
+
name: 'docker_db_query',
|
|
20
|
+
description: 'Execute a SQL query or database command',
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: {
|
|
24
|
+
service: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'Database service name from docker-compose.yml',
|
|
27
|
+
},
|
|
28
|
+
query: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'SQL query or database command',
|
|
31
|
+
},
|
|
32
|
+
database: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'Database name (overrides auto-detection)',
|
|
35
|
+
},
|
|
36
|
+
user: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'Database user (overrides auto-detection)',
|
|
39
|
+
},
|
|
40
|
+
format: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
enum: ['table', 'json', 'csv'],
|
|
43
|
+
description: 'Output format',
|
|
44
|
+
default: 'table',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
required: ['service', 'query'],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'docker_db_backup',
|
|
52
|
+
description: 'Create a database backup',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
service: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'Database service name',
|
|
59
|
+
},
|
|
60
|
+
output: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'Output file path (auto-generated if not provided)',
|
|
63
|
+
},
|
|
64
|
+
format: {
|
|
65
|
+
type: 'string',
|
|
66
|
+
enum: ['sql', 'custom', 'tar', 'directory'],
|
|
67
|
+
description: 'Backup format',
|
|
68
|
+
},
|
|
69
|
+
compress: {
|
|
70
|
+
type: 'boolean',
|
|
71
|
+
description: 'Compress backup',
|
|
72
|
+
default: true,
|
|
73
|
+
},
|
|
74
|
+
tables: {
|
|
75
|
+
type: 'array',
|
|
76
|
+
items: { type: 'string' },
|
|
77
|
+
description: 'Backup only specific tables',
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
required: ['service'],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'docker_db_restore',
|
|
85
|
+
description: 'Restore database from backup',
|
|
86
|
+
inputSchema: {
|
|
87
|
+
type: 'object',
|
|
88
|
+
properties: {
|
|
89
|
+
service: {
|
|
90
|
+
type: 'string',
|
|
91
|
+
description: 'Database service name',
|
|
92
|
+
},
|
|
93
|
+
backupPath: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: 'Path to backup file',
|
|
96
|
+
},
|
|
97
|
+
database: {
|
|
98
|
+
type: 'string',
|
|
99
|
+
description: 'Target database name',
|
|
100
|
+
},
|
|
101
|
+
clean: {
|
|
102
|
+
type: 'boolean',
|
|
103
|
+
description: 'Drop database before restore',
|
|
104
|
+
default: false,
|
|
105
|
+
},
|
|
106
|
+
dataOnly: {
|
|
107
|
+
type: 'boolean',
|
|
108
|
+
description: 'Restore only data',
|
|
109
|
+
default: false,
|
|
110
|
+
},
|
|
111
|
+
schemaOnly: {
|
|
112
|
+
type: 'boolean',
|
|
113
|
+
description: 'Restore only schema',
|
|
114
|
+
default: false,
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
required: ['service', 'backupPath'],
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: 'docker_db_status',
|
|
122
|
+
description: 'Get database status and statistics',
|
|
123
|
+
inputSchema: {
|
|
124
|
+
type: 'object',
|
|
125
|
+
properties: {
|
|
126
|
+
service: {
|
|
127
|
+
type: 'string',
|
|
128
|
+
description: 'Database service name',
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
required: ['service'],
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Обработка вызова tool
|
|
138
|
+
*/
|
|
139
|
+
async handleCall(request) {
|
|
140
|
+
const { name, arguments: args } = request.params;
|
|
141
|
+
try {
|
|
142
|
+
switch (name) {
|
|
143
|
+
case 'docker_db_query':
|
|
144
|
+
return await this.handleQuery(args);
|
|
145
|
+
case 'docker_db_backup':
|
|
146
|
+
return await this.handleBackup(args);
|
|
147
|
+
case 'docker_db_restore':
|
|
148
|
+
return await this.handleRestore(args);
|
|
149
|
+
case 'docker_db_status':
|
|
150
|
+
return await this.handleStatus(args);
|
|
151
|
+
default:
|
|
152
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
logger.error(`Tool ${name} failed:`, error);
|
|
157
|
+
return {
|
|
158
|
+
content: [
|
|
159
|
+
{
|
|
160
|
+
type: 'text',
|
|
161
|
+
text: `Error: ${error.message}`,
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
isError: true,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async handleQuery(args) {
|
|
169
|
+
if (!args.service || !args.query) {
|
|
170
|
+
throw new Error('service and query parameters are required');
|
|
171
|
+
}
|
|
172
|
+
const project = await this.projectDiscovery.findProject();
|
|
173
|
+
const serviceConfig = project.services[args.service];
|
|
174
|
+
if (!serviceConfig) {
|
|
175
|
+
throw new Error(`Service '${args.service}' not found in project`);
|
|
176
|
+
}
|
|
177
|
+
// Получаем адаптер по типу БД
|
|
178
|
+
const adapter = adapterRegistry.get(serviceConfig.type);
|
|
179
|
+
const result = await adapter.query(args.service, args.query, {
|
|
180
|
+
database: args.database,
|
|
181
|
+
user: args.user,
|
|
182
|
+
format: args.format,
|
|
183
|
+
});
|
|
184
|
+
return {
|
|
185
|
+
content: [
|
|
186
|
+
{
|
|
187
|
+
type: 'text',
|
|
188
|
+
text: result,
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
async handleBackup(args) {
|
|
194
|
+
if (!args.service) {
|
|
195
|
+
throw new Error('service parameter is required');
|
|
196
|
+
}
|
|
197
|
+
const project = await this.projectDiscovery.findProject();
|
|
198
|
+
const serviceConfig = project.services[args.service];
|
|
199
|
+
if (!serviceConfig) {
|
|
200
|
+
throw new Error(`Service '${args.service}' not found in project`);
|
|
201
|
+
}
|
|
202
|
+
const adapter = adapterRegistry.get(serviceConfig.type);
|
|
203
|
+
const backupPath = await adapter.backup(args.service, {
|
|
204
|
+
output: args.output,
|
|
205
|
+
format: args.format,
|
|
206
|
+
compress: args.compress,
|
|
207
|
+
tables: args.tables,
|
|
208
|
+
});
|
|
209
|
+
return {
|
|
210
|
+
content: [
|
|
211
|
+
{
|
|
212
|
+
type: 'text',
|
|
213
|
+
text: `✅ Backup created successfully\nLocation: ${backupPath}`,
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
async handleRestore(args) {
|
|
219
|
+
if (!args.service || !args.backupPath) {
|
|
220
|
+
throw new Error('service and backupPath parameters are required');
|
|
221
|
+
}
|
|
222
|
+
const project = await this.projectDiscovery.findProject();
|
|
223
|
+
const serviceConfig = project.services[args.service];
|
|
224
|
+
if (!serviceConfig) {
|
|
225
|
+
throw new Error(`Service '${args.service}' not found in project`);
|
|
226
|
+
}
|
|
227
|
+
const adapter = adapterRegistry.get(serviceConfig.type);
|
|
228
|
+
await adapter.restore(args.service, args.backupPath, {
|
|
229
|
+
database: args.database,
|
|
230
|
+
clean: args.clean,
|
|
231
|
+
dataOnly: args.dataOnly,
|
|
232
|
+
schemaOnly: args.schemaOnly,
|
|
233
|
+
});
|
|
234
|
+
return {
|
|
235
|
+
content: [
|
|
236
|
+
{
|
|
237
|
+
type: 'text',
|
|
238
|
+
text: `✅ Restore completed successfully`,
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
async handleStatus(args) {
|
|
244
|
+
if (!args.service) {
|
|
245
|
+
throw new Error('service parameter is required');
|
|
246
|
+
}
|
|
247
|
+
const project = await this.projectDiscovery.findProject();
|
|
248
|
+
const serviceConfig = project.services[args.service];
|
|
249
|
+
if (!serviceConfig) {
|
|
250
|
+
throw new Error(`Service '${args.service}' not found in project`);
|
|
251
|
+
}
|
|
252
|
+
const adapter = adapterRegistry.get(serviceConfig.type);
|
|
253
|
+
const status = await adapter.status(args.service);
|
|
254
|
+
return {
|
|
255
|
+
content: [
|
|
256
|
+
{
|
|
257
|
+
type: 'text',
|
|
258
|
+
text: JSON.stringify(status, null, 2),
|
|
259
|
+
},
|
|
260
|
+
],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=database-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-tools.js","sourceRoot":"","sources":["../../src/tools/database-tools.ts"],"names":[],"mappings":"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"}
|