@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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/adapters/adapter-registry.d.ts +29 -0
  4. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  5. package/dist/adapters/adapter-registry.js +47 -0
  6. package/dist/adapters/adapter-registry.js.map +1 -0
  7. package/dist/adapters/database-adapter.d.ts +33 -0
  8. package/dist/adapters/database-adapter.d.ts.map +1 -0
  9. package/dist/adapters/database-adapter.js +6 -0
  10. package/dist/adapters/database-adapter.js.map +1 -0
  11. package/dist/adapters/postgresql.d.ts +42 -0
  12. package/dist/adapters/postgresql.d.ts.map +1 -0
  13. package/dist/adapters/postgresql.js +202 -0
  14. package/dist/adapters/postgresql.js.map +1 -0
  15. package/dist/adapters/redis.d.ts +46 -0
  16. package/dist/adapters/redis.d.ts.map +1 -0
  17. package/dist/adapters/redis.js +202 -0
  18. package/dist/adapters/redis.js.map +1 -0
  19. package/dist/adapters/sqlite.d.ts +34 -0
  20. package/dist/adapters/sqlite.d.ts.map +1 -0
  21. package/dist/adapters/sqlite.js +126 -0
  22. package/dist/adapters/sqlite.js.map +1 -0
  23. package/dist/adapters/types.d.ts +53 -0
  24. package/dist/adapters/types.d.ts.map +1 -0
  25. package/dist/adapters/types.js +5 -0
  26. package/dist/adapters/types.js.map +1 -0
  27. package/dist/cli.d.ts +7 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +319 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/discovery/compose-parser.d.ts +35 -0
  32. package/dist/discovery/compose-parser.d.ts.map +1 -0
  33. package/dist/discovery/compose-parser.js +126 -0
  34. package/dist/discovery/compose-parser.js.map +1 -0
  35. package/dist/discovery/config-merger.d.ts +19 -0
  36. package/dist/discovery/config-merger.d.ts.map +1 -0
  37. package/dist/discovery/config-merger.js +60 -0
  38. package/dist/discovery/config-merger.js.map +1 -0
  39. package/dist/discovery/project-discovery.d.ts +53 -0
  40. package/dist/discovery/project-discovery.d.ts.map +1 -0
  41. package/dist/discovery/project-discovery.js +252 -0
  42. package/dist/discovery/project-discovery.js.map +1 -0
  43. package/dist/discovery/types.d.ts +47 -0
  44. package/dist/discovery/types.d.ts.map +1 -0
  45. package/dist/discovery/types.js +6 -0
  46. package/dist/discovery/types.js.map +1 -0
  47. package/dist/index.d.ts +6 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +109 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/managers/compose-manager.d.ts +30 -0
  52. package/dist/managers/compose-manager.d.ts.map +1 -0
  53. package/dist/managers/compose-manager.js +70 -0
  54. package/dist/managers/compose-manager.js.map +1 -0
  55. package/dist/managers/container-manager.d.ts +81 -0
  56. package/dist/managers/container-manager.d.ts.map +1 -0
  57. package/dist/managers/container-manager.js +278 -0
  58. package/dist/managers/container-manager.js.map +1 -0
  59. package/dist/managers/env-manager.d.ts +37 -0
  60. package/dist/managers/env-manager.d.ts.map +1 -0
  61. package/dist/managers/env-manager.js +124 -0
  62. package/dist/managers/env-manager.js.map +1 -0
  63. package/dist/security/sql-validator.d.ts +23 -0
  64. package/dist/security/sql-validator.d.ts.map +1 -0
  65. package/dist/security/sql-validator.js +44 -0
  66. package/dist/security/sql-validator.js.map +1 -0
  67. package/dist/tools/container-tools.d.ts +31 -0
  68. package/dist/tools/container-tools.d.ts.map +1 -0
  69. package/dist/tools/container-tools.js +366 -0
  70. package/dist/tools/container-tools.js.map +1 -0
  71. package/dist/tools/database-tools.d.ts +22 -0
  72. package/dist/tools/database-tools.d.ts.map +1 -0
  73. package/dist/tools/database-tools.js +264 -0
  74. package/dist/tools/database-tools.js.map +1 -0
  75. package/dist/tools/env-tools.d.ts +52 -0
  76. package/dist/tools/env-tools.d.ts.map +1 -0
  77. package/dist/tools/env-tools.js +318 -0
  78. package/dist/tools/env-tools.js.map +1 -0
  79. package/dist/tools/executor-tool.d.ts +18 -0
  80. package/dist/tools/executor-tool.d.ts.map +1 -0
  81. package/dist/tools/executor-tool.js +95 -0
  82. package/dist/tools/executor-tool.js.map +1 -0
  83. package/dist/tools/mcp-health-tool.d.ts +65 -0
  84. package/dist/tools/mcp-health-tool.d.ts.map +1 -0
  85. package/dist/tools/mcp-health-tool.js +126 -0
  86. package/dist/tools/mcp-health-tool.js.map +1 -0
  87. package/dist/utils/cache.d.ts +43 -0
  88. package/dist/utils/cache.d.ts.map +1 -0
  89. package/dist/utils/cache.js +77 -0
  90. package/dist/utils/cache.js.map +1 -0
  91. package/dist/utils/compose-exec.d.ts +13 -0
  92. package/dist/utils/compose-exec.d.ts.map +1 -0
  93. package/dist/utils/compose-exec.js +33 -0
  94. package/dist/utils/compose-exec.js.map +1 -0
  95. package/dist/utils/docker-client.d.ts +33 -0
  96. package/dist/utils/docker-client.d.ts.map +1 -0
  97. package/dist/utils/docker-client.js +59 -0
  98. package/dist/utils/docker-client.js.map +1 -0
  99. package/dist/utils/logger.d.ts +18 -0
  100. package/dist/utils/logger.d.ts.map +1 -0
  101. package/dist/utils/logger.js +38 -0
  102. package/dist/utils/logger.js.map +1 -0
  103. 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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"}