@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.
- package/README.md +99 -28
- package/dist/adapters/database-adapter.d.ts +9 -5
- package/dist/adapters/database-adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql.d.ts +14 -5
- package/dist/adapters/postgresql.d.ts.map +1 -1
- package/dist/adapters/postgresql.js +36 -23
- package/dist/adapters/postgresql.js.map +1 -1
- package/dist/adapters/redis.d.ts +10 -1
- package/dist/adapters/redis.d.ts.map +1 -1
- package/dist/adapters/redis.js +28 -13
- package/dist/adapters/redis.js.map +1 -1
- package/dist/adapters/sqlite.d.ts +11 -1
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +11 -7
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/types.d.ts +7 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/discovery/compose-parser.d.ts +4 -0
- package/dist/discovery/compose-parser.d.ts.map +1 -1
- package/dist/discovery/compose-parser.js +27 -5
- package/dist/discovery/compose-parser.js.map +1 -1
- package/dist/discovery/project-discovery.d.ts.map +1 -1
- package/dist/discovery/project-discovery.js +28 -2
- package/dist/discovery/project-discovery.js.map +1 -1
- package/dist/discovery/remote-discovery.d.ts +99 -0
- package/dist/discovery/remote-discovery.d.ts.map +1 -0
- package/dist/discovery/remote-discovery.js +410 -0
- package/dist/discovery/remote-discovery.js.map +1 -0
- package/dist/discovery/types.d.ts +4 -0
- package/dist/discovery/types.d.ts.map +1 -1
- package/dist/index.js +76 -24
- package/dist/index.js.map +1 -1
- package/dist/managers/compose-manager.d.ts +3 -1
- package/dist/managers/compose-manager.d.ts.map +1 -1
- package/dist/managers/compose-manager.js +10 -1
- package/dist/managers/compose-manager.js.map +1 -1
- package/dist/managers/container-manager.d.ts +11 -1
- package/dist/managers/container-manager.d.ts.map +1 -1
- package/dist/managers/container-manager.js +75 -76
- package/dist/managers/container-manager.js.map +1 -1
- package/dist/tools/container-tools.d.ts +1 -3
- package/dist/tools/container-tools.d.ts.map +1 -1
- package/dist/tools/container-tools.js +142 -28
- package/dist/tools/container-tools.js.map +1 -1
- package/dist/tools/database-tools.d.ts +15 -1
- package/dist/tools/database-tools.d.ts.map +1 -1
- package/dist/tools/database-tools.js +152 -16
- package/dist/tools/database-tools.js.map +1 -1
- package/dist/tools/discovery-tools.d.ts +22 -0
- package/dist/tools/discovery-tools.d.ts.map +1 -0
- package/dist/tools/discovery-tools.js +137 -0
- package/dist/tools/discovery-tools.js.map +1 -0
- package/dist/tools/env-tools.d.ts +1 -2
- package/dist/tools/env-tools.d.ts.map +1 -1
- package/dist/tools/env-tools.js +123 -22
- package/dist/tools/env-tools.js.map +1 -1
- package/dist/tools/executor-tool.d.ts +0 -2
- package/dist/tools/executor-tool.d.ts.map +1 -1
- package/dist/tools/executor-tool.js +27 -9
- package/dist/tools/executor-tool.js.map +1 -1
- package/dist/tools/mcp-health-tool.d.ts +9 -0
- package/dist/tools/mcp-health-tool.d.ts.map +1 -1
- package/dist/tools/mcp-health-tool.js +34 -7
- package/dist/tools/mcp-health-tool.js.map +1 -1
- package/dist/tools/profile-tool.d.ts +39 -0
- package/dist/tools/profile-tool.d.ts.map +1 -0
- package/dist/tools/profile-tool.js +70 -0
- package/dist/tools/profile-tool.js.map +1 -0
- package/dist/utils/compose-exec.d.ts +28 -3
- package/dist/utils/compose-exec.d.ts.map +1 -1
- package/dist/utils/compose-exec.js +100 -26
- package/dist/utils/compose-exec.js.map +1 -1
- package/dist/utils/docker-client.d.ts +81 -8
- package/dist/utils/docker-client.d.ts.map +1 -1
- package/dist/utils/docker-client.js +520 -17
- package/dist/utils/docker-client.js.map +1 -1
- package/dist/utils/profile-resolver.d.ts +58 -0
- package/dist/utils/profile-resolver.d.ts.map +1 -0
- package/dist/utils/profile-resolver.js +218 -0
- package/dist/utils/profile-resolver.js.map +1 -0
- package/dist/utils/profiles-file.d.ts +57 -0
- package/dist/utils/profiles-file.d.ts.map +1 -0
- package/dist/utils/profiles-file.js +167 -0
- package/dist/utils/profiles-file.js.map +1 -0
- package/dist/utils/remote-compose.d.ts +32 -0
- package/dist/utils/remote-compose.d.ts.map +1 -0
- package/dist/utils/remote-compose.js +69 -0
- package/dist/utils/remote-compose.js.map +1 -0
- package/dist/utils/retry.d.ts +49 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +120 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/schema-helpers.d.ts +96 -0
- package/dist/utils/schema-helpers.d.ts.map +1 -0
- package/dist/utils/schema-helpers.js +61 -0
- package/dist/utils/schema-helpers.js.map +1 -0
- package/dist/utils/ssh-config.d.ts +104 -0
- package/dist/utils/ssh-config.d.ts.map +1 -0
- package/dist/utils/ssh-config.js +346 -0
- package/dist/utils/ssh-config.js.map +1 -0
- package/dist/utils/ssh-exec.d.ts +59 -0
- package/dist/utils/ssh-exec.d.ts.map +1 -0
- package/dist/utils/ssh-exec.js +159 -0
- package/dist/utils/ssh-exec.js.map +1 -0
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
178
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
-
|
|
253
|
-
|
|
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,
|
|
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;
|
|
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"}
|