@hypnosis/docker-mcp-server 1.0.4 → 1.3.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 (105) hide show
  1. package/README.md +99 -28
  2. package/dist/adapters/database-adapter.d.ts +9 -5
  3. package/dist/adapters/database-adapter.d.ts.map +1 -1
  4. package/dist/adapters/postgresql.d.ts +14 -5
  5. package/dist/adapters/postgresql.d.ts.map +1 -1
  6. package/dist/adapters/postgresql.js +36 -23
  7. package/dist/adapters/postgresql.js.map +1 -1
  8. package/dist/adapters/redis.d.ts +10 -1
  9. package/dist/adapters/redis.d.ts.map +1 -1
  10. package/dist/adapters/redis.js +28 -13
  11. package/dist/adapters/redis.js.map +1 -1
  12. package/dist/adapters/sqlite.d.ts +11 -1
  13. package/dist/adapters/sqlite.d.ts.map +1 -1
  14. package/dist/adapters/sqlite.js +11 -7
  15. package/dist/adapters/sqlite.js.map +1 -1
  16. package/dist/adapters/types.d.ts +7 -0
  17. package/dist/adapters/types.d.ts.map +1 -1
  18. package/dist/discovery/compose-parser.d.ts +4 -0
  19. package/dist/discovery/compose-parser.d.ts.map +1 -1
  20. package/dist/discovery/compose-parser.js +27 -5
  21. package/dist/discovery/compose-parser.js.map +1 -1
  22. package/dist/discovery/project-discovery.d.ts.map +1 -1
  23. package/dist/discovery/project-discovery.js +28 -2
  24. package/dist/discovery/project-discovery.js.map +1 -1
  25. package/dist/discovery/remote-discovery.d.ts +99 -0
  26. package/dist/discovery/remote-discovery.d.ts.map +1 -0
  27. package/dist/discovery/remote-discovery.js +410 -0
  28. package/dist/discovery/remote-discovery.js.map +1 -0
  29. package/dist/discovery/types.d.ts +4 -0
  30. package/dist/discovery/types.d.ts.map +1 -1
  31. package/dist/index.js +76 -24
  32. package/dist/index.js.map +1 -1
  33. package/dist/managers/compose-manager.d.ts +3 -1
  34. package/dist/managers/compose-manager.d.ts.map +1 -1
  35. package/dist/managers/compose-manager.js +10 -1
  36. package/dist/managers/compose-manager.js.map +1 -1
  37. package/dist/managers/container-manager.d.ts +11 -1
  38. package/dist/managers/container-manager.d.ts.map +1 -1
  39. package/dist/managers/container-manager.js +75 -76
  40. package/dist/managers/container-manager.js.map +1 -1
  41. package/dist/tools/container-tools.d.ts +1 -3
  42. package/dist/tools/container-tools.d.ts.map +1 -1
  43. package/dist/tools/container-tools.js +142 -28
  44. package/dist/tools/container-tools.js.map +1 -1
  45. package/dist/tools/database-tools.d.ts +15 -1
  46. package/dist/tools/database-tools.d.ts.map +1 -1
  47. package/dist/tools/database-tools.js +152 -16
  48. package/dist/tools/database-tools.js.map +1 -1
  49. package/dist/tools/discovery-tools.d.ts +22 -0
  50. package/dist/tools/discovery-tools.d.ts.map +1 -0
  51. package/dist/tools/discovery-tools.js +137 -0
  52. package/dist/tools/discovery-tools.js.map +1 -0
  53. package/dist/tools/env-tools.d.ts +1 -2
  54. package/dist/tools/env-tools.d.ts.map +1 -1
  55. package/dist/tools/env-tools.js +123 -22
  56. package/dist/tools/env-tools.js.map +1 -1
  57. package/dist/tools/executor-tool.d.ts +0 -2
  58. package/dist/tools/executor-tool.d.ts.map +1 -1
  59. package/dist/tools/executor-tool.js +27 -9
  60. package/dist/tools/executor-tool.js.map +1 -1
  61. package/dist/tools/mcp-health-tool.d.ts +9 -0
  62. package/dist/tools/mcp-health-tool.d.ts.map +1 -1
  63. package/dist/tools/mcp-health-tool.js +34 -7
  64. package/dist/tools/mcp-health-tool.js.map +1 -1
  65. package/dist/tools/profile-tool.d.ts +39 -0
  66. package/dist/tools/profile-tool.d.ts.map +1 -0
  67. package/dist/tools/profile-tool.js +70 -0
  68. package/dist/tools/profile-tool.js.map +1 -0
  69. package/dist/utils/compose-exec.d.ts +28 -3
  70. package/dist/utils/compose-exec.d.ts.map +1 -1
  71. package/dist/utils/compose-exec.js +100 -26
  72. package/dist/utils/compose-exec.js.map +1 -1
  73. package/dist/utils/docker-client.d.ts +81 -8
  74. package/dist/utils/docker-client.d.ts.map +1 -1
  75. package/dist/utils/docker-client.js +520 -17
  76. package/dist/utils/docker-client.js.map +1 -1
  77. package/dist/utils/profile-resolver.d.ts +58 -0
  78. package/dist/utils/profile-resolver.d.ts.map +1 -0
  79. package/dist/utils/profile-resolver.js +218 -0
  80. package/dist/utils/profile-resolver.js.map +1 -0
  81. package/dist/utils/profiles-file.d.ts +57 -0
  82. package/dist/utils/profiles-file.d.ts.map +1 -0
  83. package/dist/utils/profiles-file.js +167 -0
  84. package/dist/utils/profiles-file.js.map +1 -0
  85. package/dist/utils/remote-compose.d.ts +32 -0
  86. package/dist/utils/remote-compose.d.ts.map +1 -0
  87. package/dist/utils/remote-compose.js +69 -0
  88. package/dist/utils/remote-compose.js.map +1 -0
  89. package/dist/utils/retry.d.ts +49 -0
  90. package/dist/utils/retry.d.ts.map +1 -0
  91. package/dist/utils/retry.js +120 -0
  92. package/dist/utils/retry.js.map +1 -0
  93. package/dist/utils/schema-helpers.d.ts +96 -0
  94. package/dist/utils/schema-helpers.d.ts.map +1 -0
  95. package/dist/utils/schema-helpers.js +61 -0
  96. package/dist/utils/schema-helpers.js.map +1 -0
  97. package/dist/utils/ssh-config.d.ts +104 -0
  98. package/dist/utils/ssh-config.d.ts.map +1 -0
  99. package/dist/utils/ssh-config.js +346 -0
  100. package/dist/utils/ssh-config.js.map +1 -0
  101. package/dist/utils/ssh-exec.d.ts +59 -0
  102. package/dist/utils/ssh-exec.d.ts.map +1 -0
  103. package/dist/utils/ssh-exec.js +159 -0
  104. package/dist/utils/ssh-exec.js.map +1 -0
  105. package/package.json +21 -3
@@ -2,13 +2,18 @@
2
2
  * Database Tools
3
3
  * MCP Tools for working with databases
4
4
  */
5
- import { adapterRegistry } from '../adapters/adapter-registry.js';
5
+ import { PostgreSQLAdapter } from '../adapters/postgresql.js';
6
+ import { RedisAdapter } from '../adapters/redis.js';
7
+ import { SQLiteAdapter } from '../adapters/sqlite.js';
8
+ import { ContainerManager } from '../managers/container-manager.js';
6
9
  import { ProjectDiscovery } from '../discovery/project-discovery.js';
10
+ import { EnvManager } from '../managers/env-manager.js';
7
11
  import { logger } from '../utils/logger.js';
12
+ import { resolveSSHConfig } from '../utils/profile-resolver.js';
13
+ import { readRemoteComposeFile } from '../utils/remote-compose.js';
8
14
  export class DatabaseTools {
9
- projectDiscovery;
10
15
  constructor() {
11
- this.projectDiscovery = new ProjectDiscovery();
16
+ // No shared state - adapters created per request
12
17
  }
13
18
  /**
14
19
  * Register all database tools
@@ -25,6 +30,14 @@ export class DatabaseTools {
25
30
  type: 'string',
26
31
  description: 'Database service name from docker-compose.yml',
27
32
  },
33
+ profile: {
34
+ type: 'string',
35
+ description: 'Profile name from DOCKER_PROFILES environment variable (default: uses default profile)',
36
+ },
37
+ project: {
38
+ type: 'string',
39
+ description: 'Project name (auto-detected if not provided)',
40
+ },
28
41
  query: {
29
42
  type: 'string',
30
43
  description: 'SQL query or database command',
@@ -57,6 +70,14 @@ export class DatabaseTools {
57
70
  type: 'string',
58
71
  description: 'Database service name',
59
72
  },
73
+ profile: {
74
+ type: 'string',
75
+ description: 'Profile name from DOCKER_PROFILES environment variable (default: uses default profile)',
76
+ },
77
+ project: {
78
+ type: 'string',
79
+ description: 'Project name (auto-detected if not provided)',
80
+ },
60
81
  output: {
61
82
  type: 'string',
62
83
  description: 'Output file path (auto-generated if not provided)',
@@ -90,6 +111,14 @@ export class DatabaseTools {
90
111
  type: 'string',
91
112
  description: 'Database service name',
92
113
  },
114
+ profile: {
115
+ type: 'string',
116
+ description: 'Profile name from DOCKER_PROFILES environment variable (default: uses default profile)',
117
+ },
118
+ project: {
119
+ type: 'string',
120
+ description: 'Project name (auto-detected if not provided)',
121
+ },
93
122
  backupPath: {
94
123
  type: 'string',
95
124
  description: 'Path to backup file',
@@ -127,6 +156,14 @@ export class DatabaseTools {
127
156
  type: 'string',
128
157
  description: 'Database service name',
129
158
  },
159
+ profile: {
160
+ type: 'string',
161
+ description: 'Profile name from DOCKER_PROFILES environment variable (default: uses default profile)',
162
+ },
163
+ project: {
164
+ type: 'string',
165
+ description: 'Project name (auto-detected if not provided)',
166
+ },
130
167
  },
131
168
  required: ['service'],
132
169
  },
@@ -165,22 +202,106 @@ export class DatabaseTools {
165
202
  };
166
203
  }
167
204
  }
205
+ /**
206
+ * Validate profile configuration
207
+ * Throws explicit error if profile specified but not found
208
+ */
209
+ validateProfile(profile, sshConfig) {
210
+ // ❗ CRITICAL: If profile specified, SSH config MUST be present
211
+ if (profile && !sshConfig) {
212
+ throw new Error(`❌ PROFILE ERROR: Profile "${profile}" was specified but could not be resolved.\n` +
213
+ `\n` +
214
+ `Possible causes:\n` +
215
+ ` 1. Profile "${profile}" not found in DOCKER_PROFILES environment variable\n` +
216
+ ` 2. DOCKER_PROFILES environment variable not set\n` +
217
+ ` 3. DOCKER_PROFILES JSON is invalid or missing\n` +
218
+ `\n` +
219
+ `⚠️ NO FALLBACK TO LOCAL: This is intentional to prevent accidental local operations.\n` +
220
+ ` If you want to use local Docker, omit the "profile" parameter.`);
221
+ }
222
+ // Log successful profile resolution
223
+ if (profile && sshConfig) {
224
+ logger.info(`✅ Profile "${profile}" resolved successfully: ${sshConfig.host}:${sshConfig.port || 22}`);
225
+ }
226
+ else if (!profile) {
227
+ logger.debug('Using local Docker (no profile specified)');
228
+ }
229
+ }
230
+ /**
231
+ * Create database adapter with dependency injection
232
+ * All dependencies are explicitly created and passed
233
+ */
234
+ createAdapter(serviceType, sshConfig) {
235
+ // Create managers with explicit SSH config
236
+ const containerManager = new ContainerManager(sshConfig);
237
+ const projectDiscovery = new ProjectDiscovery();
238
+ const envManager = new EnvManager();
239
+ // Create adapter with dependency injection
240
+ const normalizedType = serviceType.toLowerCase();
241
+ switch (normalizedType) {
242
+ case 'postgresql':
243
+ case 'postgres':
244
+ logger.debug(`Creating PostgreSQLAdapter with ${sshConfig ? 'remote' : 'local'} Docker`);
245
+ return new PostgreSQLAdapter(containerManager, projectDiscovery, envManager);
246
+ case 'redis':
247
+ logger.debug(`Creating RedisAdapter with ${sshConfig ? 'remote' : 'local'} Docker`);
248
+ return new RedisAdapter(containerManager, projectDiscovery, envManager);
249
+ case 'sqlite':
250
+ case 'sqlite3':
251
+ logger.debug(`Creating SQLiteAdapter with ${sshConfig ? 'remote' : 'local'} Docker`);
252
+ return new SQLiteAdapter(containerManager, projectDiscovery, envManager);
253
+ default:
254
+ throw new Error(`❌ DATABASE ERROR: Unsupported database type: ${serviceType}\n` +
255
+ `\n` +
256
+ `Supported types:\n` +
257
+ ` - postgresql (postgres)\n` +
258
+ ` - redis\n` +
259
+ ` - sqlite (sqlite3)`);
260
+ }
261
+ }
262
+ /**
263
+ * Get project helper (unified pattern with other tools)
264
+ * Reads remote/local compose file based on SSH config
265
+ */
266
+ async getProject(projectName, sshConfig) {
267
+ // If SSH config provided (remote mode), read remote compose file
268
+ if (sshConfig) {
269
+ let finalProjectName;
270
+ if (projectName) {
271
+ finalProjectName = projectName;
272
+ }
273
+ else {
274
+ // Use working directory name as fallback
275
+ const cwd = process.cwd();
276
+ finalProjectName = cwd.split('/').pop() || 'docker-mcp-server';
277
+ }
278
+ // ✅ FIX BUG-007: Read and parse remote docker-compose.yml
279
+ logger.info(`Reading remote compose file for project: ${finalProjectName}`);
280
+ return await readRemoteComposeFile(finalProjectName, sshConfig);
281
+ }
282
+ // Local mode: use local discovery
283
+ const projectDiscovery = new ProjectDiscovery();
284
+ return await projectDiscovery.findProject(projectName ? { explicitProjectName: projectName } : {});
285
+ }
168
286
  async handleQuery(args) {
169
287
  if (!args.service || !args.query) {
170
288
  throw new Error('service and query parameters are required');
171
289
  }
172
- const project = await this.projectDiscovery.findProject();
290
+ // Resolve profile once (unified pattern)
291
+ const sshConfig = resolveSSHConfig(args);
292
+ this.validateProfile(args?.profile, sshConfig);
293
+ const project = await this.getProject(args?.project, sshConfig);
173
294
  const serviceConfig = project.services[args.service];
174
295
  if (!serviceConfig) {
175
296
  throw new Error(`Service '${args.service}' not found in project`);
176
297
  }
177
- // Get adapter by database type
178
- const adapter = adapterRegistry.get(serviceConfig.type);
298
+ const adapter = this.createAdapter(serviceConfig.type, sshConfig);
299
+ // ✅ FIX BUG-007: Pass project to adapter for remote mode
179
300
  const result = await adapter.query(args.service, args.query, {
180
301
  database: args.database,
181
302
  user: args.user,
182
303
  format: args.format,
183
- });
304
+ }, project);
184
305
  return {
185
306
  content: [
186
307
  {
@@ -194,18 +315,21 @@ export class DatabaseTools {
194
315
  if (!args.service) {
195
316
  throw new Error('service parameter is required');
196
317
  }
197
- const project = await this.projectDiscovery.findProject();
318
+ const sshConfig = resolveSSHConfig(args);
319
+ this.validateProfile(args?.profile, sshConfig);
320
+ const project = await this.getProject(args?.project, sshConfig);
198
321
  const serviceConfig = project.services[args.service];
199
322
  if (!serviceConfig) {
200
323
  throw new Error(`Service '${args.service}' not found in project`);
201
324
  }
202
- const adapter = adapterRegistry.get(serviceConfig.type);
325
+ const adapter = this.createAdapter(serviceConfig.type, sshConfig);
326
+ // ✅ FIX BUG-007: Pass project to adapter for remote mode
203
327
  const backupPath = await adapter.backup(args.service, {
204
328
  output: args.output,
205
329
  format: args.format,
206
330
  compress: args.compress,
207
331
  tables: args.tables,
208
- });
332
+ }, project);
209
333
  return {
210
334
  content: [
211
335
  {
@@ -219,18 +343,21 @@ export class DatabaseTools {
219
343
  if (!args.service || !args.backupPath) {
220
344
  throw new Error('service and backupPath parameters are required');
221
345
  }
222
- const project = await this.projectDiscovery.findProject();
346
+ const sshConfig = resolveSSHConfig(args);
347
+ this.validateProfile(args?.profile, sshConfig);
348
+ const project = await this.getProject(args?.project, sshConfig);
223
349
  const serviceConfig = project.services[args.service];
224
350
  if (!serviceConfig) {
225
351
  throw new Error(`Service '${args.service}' not found in project`);
226
352
  }
227
- const adapter = adapterRegistry.get(serviceConfig.type);
353
+ const adapter = this.createAdapter(serviceConfig.type, sshConfig);
354
+ // ✅ FIX BUG-007: Pass project to adapter for remote mode
228
355
  await adapter.restore(args.service, args.backupPath, {
229
356
  database: args.database,
230
357
  clean: args.clean,
231
358
  dataOnly: args.dataOnly,
232
359
  schemaOnly: args.schemaOnly,
233
- });
360
+ }, project);
234
361
  return {
235
362
  content: [
236
363
  {
@@ -244,13 +371,22 @@ export class DatabaseTools {
244
371
  if (!args.service) {
245
372
  throw new Error('service parameter is required');
246
373
  }
247
- const project = await this.projectDiscovery.findProject();
374
+ const sshConfig = resolveSSHConfig(args);
375
+ this.validateProfile(args?.profile, sshConfig);
376
+ const project = await this.getProject(args?.project, sshConfig);
248
377
  const serviceConfig = project.services[args.service];
249
378
  if (!serviceConfig) {
250
379
  throw new Error(`Service '${args.service}' not found in project`);
251
380
  }
252
- const adapter = adapterRegistry.get(serviceConfig.type);
253
- const status = await adapter.status(args.service);
381
+ if (serviceConfig.type === 'generic') {
382
+ throw new Error(`❌ Service type detection failed!\n` +
383
+ `Service "${args.service}" was detected as "generic" instead of a database type.\n` +
384
+ `Image: ${serviceConfig.image || 'unknown'}\n` +
385
+ `Please check the image name in docker-compose.yml.`);
386
+ }
387
+ const adapter = this.createAdapter(serviceConfig.type, sshConfig);
388
+ // ✅ FIX BUG-007: Pass project to adapter for remote mode
389
+ const status = await adapter.status(args.service, project);
254
390
  return {
255
391
  content: [
256
392
  {
@@ -1 +1 @@
1
- {"version":3,"file":"database-tools.js","sourceRoot":"","sources":["../../src/tools/database-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,aAAa;IAChB,gBAAgB,CAAmB;IAE3C;QACE,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO;YACL;gBACE,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,yCAAyC;gBACtD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,+CAA+C;yBAC7D;wBACD,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,+BAA+B;yBAC7C;wBACD,QAAQ,EAAE;4BACR,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,0CAA0C;yBACxD;wBACD,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,0CAA0C;yBACxD;wBACD,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;4BAC9B,WAAW,EAAE,eAAe;4BAC5B,OAAO,EAAE,OAAO;yBACjB;qBACF;oBACD,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;iBAC/B;aACF;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EAAE,0BAA0B;gBACvC,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,uBAAuB;yBACrC;wBACD,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,mDAAmD;yBACjE;wBACD,MAAM,EAAE;4BACN,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC;4BAC3C,WAAW,EAAE,eAAe;yBAC7B;wBACD,QAAQ,EAAE;4BACR,IAAI,EAAE,SAAS;4BACf,WAAW,EAAE,iBAAiB;4BAC9B,OAAO,EAAE,IAAI;yBACd;wBACD,MAAM,EAAE;4BACN,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACzB,WAAW,EAAE,6BAA6B;yBAC3C;qBACF;oBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;iBACtB;aACF;YACD;gBACE,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EAAE,8BAA8B;gBAC3C,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,uBAAuB;yBACrC;wBACD,UAAU,EAAE;4BACV,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,qBAAqB;yBACnC;wBACD,QAAQ,EAAE;4BACR,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,sBAAsB;yBACpC;wBACD,KAAK,EAAE;4BACL,IAAI,EAAE,SAAS;4BACf,WAAW,EAAE,8BAA8B;4BAC3C,OAAO,EAAE,KAAK;yBACf;wBACD,QAAQ,EAAE;4BACR,IAAI,EAAE,SAAS;4BACf,WAAW,EAAE,mBAAmB;4BAChC,OAAO,EAAE,KAAK;yBACf;wBACD,UAAU,EAAE;4BACV,IAAI,EAAE,SAAS;4BACf,WAAW,EAAE,qBAAqB;4BAClC,OAAO,EAAE,KAAK;yBACf;qBACF;oBACD,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;iBACpC;aACF;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EAAE,oCAAoC;gBACjD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE;4BACP,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,uBAAuB;yBACrC;qBACF;oBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;iBACtB;aACF;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAAwB;QACvC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,IAAI,CAAC;YACH,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,iBAAiB;oBACpB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAEtC,KAAK,kBAAkB;oBACrB,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAEvC,KAAK,mBAAmB;oBACtB,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAExC,KAAK,kBAAkB;oBACrB,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAEvC;oBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE;qBAChC;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAS;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,OAAO,wBAAwB,CAAC,CAAC;QACpE,CAAC;QAED,+BAA+B;QAC/B,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE;YAC3D,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;iBACb;aACF;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAS;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,OAAO,wBAAwB,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;YACpD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,4CAA4C,UAAU,EAAE;iBAC/D;aACF;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAS;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,OAAO,wBAAwB,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YACnD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kCAAkC;iBACzC;aACF;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAS;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,OAAO,wBAAwB,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"database-tools.js","sourceRoot":"","sources":["../../src/tools/database-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Discovery Tools
3
+ * Tools for discovering Docker projects on remote servers
4
+ */
5
+ import { CallToolRequest, Tool } from '@modelcontextprotocol/sdk/types.js';
6
+ export declare class DiscoveryTools {
7
+ constructor();
8
+ /**
9
+ * Register discovery tools
10
+ */
11
+ getTools(): Tool[];
12
+ /**
13
+ * Handle tool call
14
+ */
15
+ handleCall(request: CallToolRequest): Promise<any>;
16
+ /**
17
+ * Handle projects list
18
+ * Works for both local and remote Docker using Docker Compose labels
19
+ */
20
+ private handleProjects;
21
+ }
22
+ //# sourceMappingURL=discovery-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-tools.d.ts","sourceRoot":"","sources":["../../src/tools/discovery-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,IAAI,EACL,MAAM,oCAAoC,CAAC;AAO5C,qBAAa,cAAc;;IAMzB;;OAEG;IACH,QAAQ,IAAI,IAAI,EAAE;IAsBlB;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IAyBxD;;;OAGG;YACW,cAAc;CAiF7B"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Discovery Tools
3
+ * Tools for discovering Docker projects on remote servers
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ import { getDockerClient } from '../utils/docker-client.js';
7
+ import { resolveSSHConfig } from '../utils/profile-resolver.js';
8
+ export class DiscoveryTools {
9
+ // ❗ АРХИТЕКТУРА: sshConfig резолвится из args.profile при каждом вызове
10
+ constructor() {
11
+ // No shared state - sshConfig resolved per request
12
+ }
13
+ /**
14
+ * Register discovery tools
15
+ */
16
+ getTools() {
17
+ return [
18
+ {
19
+ name: 'docker_projects',
20
+ description: 'List all Docker projects with their status. Fast mode using Docker labels only (~2s). Use docker_container_list({project: "name"}) for detailed container info.',
21
+ inputSchema: {
22
+ type: 'object',
23
+ properties: {
24
+ profile: {
25
+ type: 'string',
26
+ description: 'Profile name from DOCKER_PROFILES environment variable (default: uses default profile)',
27
+ },
28
+ path: {
29
+ type: 'string',
30
+ description: 'Base path to search for projects (default: from profile or /var/www)',
31
+ },
32
+ },
33
+ },
34
+ },
35
+ ];
36
+ }
37
+ /**
38
+ * Handle tool call
39
+ */
40
+ async handleCall(request) {
41
+ const { name, arguments: args } = request.params;
42
+ try {
43
+ switch (name) {
44
+ case 'docker_projects':
45
+ return await this.handleProjects(args);
46
+ default:
47
+ throw new Error(`Unknown tool: ${name}`);
48
+ }
49
+ }
50
+ catch (error) {
51
+ logger.error(`Discovery tool ${name} failed:`, error);
52
+ return {
53
+ content: [
54
+ {
55
+ type: 'text',
56
+ text: `Error: ${error.message}`,
57
+ },
58
+ ],
59
+ isError: true,
60
+ };
61
+ }
62
+ }
63
+ /**
64
+ * Handle projects list
65
+ * Works for both local and remote Docker using Docker Compose labels
66
+ */
67
+ async handleProjects(args) {
68
+ // Resolve SSH config from profile
69
+ const sshConfig = resolveSSHConfig(args);
70
+ // Get Docker client (works for both local and remote)
71
+ const dockerClient = getDockerClient(sshConfig);
72
+ const docker = dockerClient.getClient();
73
+ // Get all containers with compose labels
74
+ const allContainers = await docker.listContainers({ all: true });
75
+ const containersWithLabels = allContainers.filter(container => {
76
+ const labels = container.Labels || {};
77
+ return Object.keys(labels).some(key => key.startsWith('com.docker.compose.'));
78
+ });
79
+ if (containersWithLabels.length === 0) {
80
+ return {
81
+ content: [
82
+ {
83
+ type: 'text',
84
+ text: 'No Docker projects found with Compose labels.',
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ // Group containers by project name from labels
90
+ const projectsMap = new Map();
91
+ containersWithLabels.forEach(container => {
92
+ const labels = container.Labels || {};
93
+ const projectName = labels['com.docker.compose.project'] || 'default';
94
+ if (!projectsMap.has(projectName)) {
95
+ projectsMap.set(projectName, { running: 0, total: 0 });
96
+ }
97
+ const project = projectsMap.get(projectName);
98
+ project.total++;
99
+ if (container.State === 'running') {
100
+ project.running++;
101
+ }
102
+ });
103
+ // Calculate summary
104
+ const projects = Array.from(projectsMap.entries()).map(([name, data]) => ({
105
+ name,
106
+ running: data.running,
107
+ total: data.total,
108
+ status: data.running === data.total ? 'running' : data.running === 0 ? 'stopped' : 'partial',
109
+ }));
110
+ const summary = {
111
+ total: projects.length,
112
+ running: projects.filter(p => p.status === 'running').length,
113
+ partial: projects.filter(p => p.status === 'partial').length,
114
+ stopped: projects.filter(p => p.status === 'stopped').length,
115
+ };
116
+ // Format result
117
+ const output = [
118
+ `Found ${summary.total} projects:\n`,
119
+ `- Running: ${summary.running}`,
120
+ `- Partial: ${summary.partial}`,
121
+ `- Stopped: ${summary.stopped}\n`,
122
+ ...projects.map(p => {
123
+ const statusIcon = p.status === 'running' ? '✅' : p.status === 'partial' ? '⚠️' : '❌';
124
+ return `${statusIcon} ${p.name} (${p.running}/${p.total} running)`;
125
+ }),
126
+ ].join('\n');
127
+ return {
128
+ content: [
129
+ {
130
+ type: 'text',
131
+ text: output,
132
+ },
133
+ ],
134
+ };
135
+ }
136
+ }
137
+ //# sourceMappingURL=discovery-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-tools.js","sourceRoot":"","sources":["../../src/tools/discovery-tools.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,6 @@
5
5
  import { CallToolRequest, Tool } from '@modelcontextprotocol/sdk/types.js';
6
6
  export declare class EnvTools {
7
7
  private envManager;
8
- private projectDiscovery;
9
- private containerManager;
10
8
  private composeParser;
11
9
  constructor();
12
10
  /**
@@ -30,6 +28,7 @@ export declare class EnvTools {
30
28
  }>;
31
29
  /**
32
30
  * Get project (helper)
31
+ * Reads and parses remote docker-compose.yml if SSH config provided
33
32
  */
34
33
  private getProject;
35
34
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"env-tools.d.ts","sourceRoot":"","sources":["../../src/tools/env-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,IAAI,EACL,MAAM,oCAAoC,CAAC;AAS5C,qBAAa,QAAQ;IACnB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAgB;;IASrC;;OAEG;IACH,QAAQ,IAAI,IAAI,EAAE;IAwElB;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,eAAe;;;;;;;;;;;;IA+BzC;;OAEG;YACW,UAAU;IAMxB;;OAEG;YACW,aAAa;IAoD3B;;OAEG;YACW,mBAAmB;IAgEjC;;OAEG;YACW,iBAAiB;IAoE/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAiB/B"}
1
+ {"version":3,"file":"env-tools.d.ts","sourceRoot":"","sources":["../../src/tools/env-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,IAAI,EACL,MAAM,oCAAoC,CAAC;AAa5C,qBAAa,QAAQ;IAGnB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAgB;;IAOrC;;OAEG;IACH,QAAQ,IAAI,IAAI,EAAE;IAoFlB;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,eAAe;;;;;;;;;;;;IA+BzC;;;OAGG;YACW,UAAU;IAwBxB;;OAEG;YACW,aAAa;IA0E3B;;OAEG;YACW,mBAAmB;IAoHjC;;OAEG;YACW,iBAAiB;IAuE/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAiB/B"}