@hypnosis/docker-mcp-server 1.0.1 → 1.0.4

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 (56) hide show
  1. package/README.md +15 -1
  2. package/dist/adapters/adapter-registry.d.ts +5 -5
  3. package/dist/adapters/adapter-registry.js +5 -5
  4. package/dist/adapters/database-adapter.d.ts +8 -8
  5. package/dist/adapters/database-adapter.js +1 -1
  6. package/dist/adapters/postgresql.d.ts +8 -8
  7. package/dist/adapters/postgresql.js +26 -26
  8. package/dist/adapters/postgresql.js.map +1 -1
  9. package/dist/adapters/redis.d.ts +9 -9
  10. package/dist/adapters/redis.js +23 -23
  11. package/dist/adapters/redis.js.map +1 -1
  12. package/dist/adapters/sqlite.d.ts +6 -6
  13. package/dist/adapters/sqlite.js +14 -14
  14. package/dist/adapters/sqlite.js.map +1 -1
  15. package/dist/adapters/types.d.ts +6 -6
  16. package/dist/adapters/types.js +1 -1
  17. package/dist/discovery/project-discovery.d.ts.map +1 -1
  18. package/dist/discovery/project-discovery.js +17 -3
  19. package/dist/discovery/project-discovery.js.map +1 -1
  20. package/dist/index.js +56 -18
  21. package/dist/index.js.map +1 -1
  22. package/dist/managers/compose-manager.d.ts.map +1 -1
  23. package/dist/managers/compose-manager.js +33 -4
  24. package/dist/managers/compose-manager.js.map +1 -1
  25. package/dist/managers/container-manager.d.ts +57 -13
  26. package/dist/managers/container-manager.d.ts.map +1 -1
  27. package/dist/managers/container-manager.js +140 -28
  28. package/dist/managers/container-manager.js.map +1 -1
  29. package/dist/tools/container-tools.d.ts +6 -4
  30. package/dist/tools/container-tools.d.ts.map +1 -1
  31. package/dist/tools/container-tools.js +87 -8
  32. package/dist/tools/container-tools.js.map +1 -1
  33. package/dist/tools/database-tools.d.ts +3 -3
  34. package/dist/tools/database-tools.js +4 -4
  35. package/dist/tools/database-tools.js.map +1 -1
  36. package/dist/tools/env-tools.d.ts +4 -4
  37. package/dist/tools/env-tools.js +9 -9
  38. package/dist/tools/env-tools.js.map +1 -1
  39. package/dist/tools/executor-tool.d.ts +3 -3
  40. package/dist/tools/executor-tool.js +6 -6
  41. package/dist/tools/executor-tool.js.map +1 -1
  42. package/dist/tools/mcp-health-tool.d.ts +4 -4
  43. package/dist/tools/mcp-health-tool.js +5 -5
  44. package/dist/tools/mcp-health-tool.js.map +1 -1
  45. package/dist/utils/compose-exec.d.ts.map +1 -1
  46. package/dist/utils/compose-exec.js +16 -1
  47. package/dist/utils/compose-exec.js.map +1 -1
  48. package/dist/utils/port-utils.d.ts +24 -0
  49. package/dist/utils/port-utils.d.ts.map +1 -0
  50. package/dist/utils/port-utils.js +89 -0
  51. package/dist/utils/port-utils.js.map +1 -0
  52. package/dist/utils/workspace.d.ts +34 -0
  53. package/dist/utils/workspace.d.ts.map +1 -0
  54. package/dist/utils/workspace.js +52 -0
  55. package/dist/utils/workspace.js.map +1 -0
  56. package/package.json +1 -1
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Port Utilities
3
+ * Утилиты для работы с портами Docker контейнеров
4
+ */
5
+ export interface PortConflict {
6
+ port: number;
7
+ containerId: string;
8
+ containerName: string;
9
+ status: string;
10
+ }
11
+ /**
12
+ * Находит контейнер, который занимает указанный порт
13
+ */
14
+ export declare function findContainerByPort(port: number): Promise<PortConflict | null>;
15
+ /**
16
+ * Извлекает номер порта из ошибки Docker
17
+ * Пример: "Bind for 0.0.0.0:5432 failed: port is already allocated" -> 5432
18
+ */
19
+ export declare function extractPortFromError(errorMessage: string): number | null;
20
+ /**
21
+ * Останавливает контейнер по ID
22
+ */
23
+ export declare function stopContainerById(containerId: string): Promise<void>;
24
+ //# sourceMappingURL=port-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-utils.d.ts","sourceRoot":"","sources":["../../src/utils/port-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmCpF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBxE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB1E"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Port Utilities
3
+ * Утилиты для работы с портами Docker контейнеров
4
+ */
5
+ import { getDockerClient } from './docker-client.js';
6
+ import { logger } from './logger.js';
7
+ /**
8
+ * Находит контейнер, который занимает указанный порт
9
+ */
10
+ export async function findContainerByPort(port) {
11
+ const docker = getDockerClient().getClient();
12
+ try {
13
+ // Получаем все контейнеры (включая остановленные)
14
+ const containers = await docker.listContainers({ all: true });
15
+ for (const containerInfo of containers) {
16
+ // Проверяем порты контейнера
17
+ if (containerInfo.Ports) {
18
+ for (const portInfo of containerInfo.Ports) {
19
+ // Проверяем published порт (0.0.0.0:5432 -> 5432/tcp)
20
+ if (portInfo.PublicPort === port) {
21
+ const containerId = containerInfo.Id;
22
+ const containerName = containerInfo.Names[0]?.replace(/^\//, '') || containerId.substring(0, 12);
23
+ const status = containerInfo.Status || 'unknown';
24
+ logger.info(`Found container using port ${port}: ${containerName} (${containerId.substring(0, 12)})`);
25
+ return {
26
+ port,
27
+ containerId,
28
+ containerName,
29
+ status,
30
+ };
31
+ }
32
+ }
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+ catch (error) {
38
+ logger.error(`Failed to find container by port ${port}:`, error);
39
+ return null;
40
+ }
41
+ }
42
+ /**
43
+ * Извлекает номер порта из ошибки Docker
44
+ * Пример: "Bind for 0.0.0.0:5432 failed: port is already allocated" -> 5432
45
+ */
46
+ export function extractPortFromError(errorMessage) {
47
+ // Паттерн: "Bind for 0.0.0.0:5432 failed" или "port 5432 is already allocated"
48
+ const patterns = [
49
+ /Bind for [\d.]+:(\d+)/i, // "Bind for 0.0.0.0:5432"
50
+ /port (\d+) is already allocated/i, // "port 5432 is already allocated"
51
+ /port (\d+) is already in use/i, // "port 5432 is already in use"
52
+ /:(\d+) failed/i, // ":5432 failed" (fallback)
53
+ ];
54
+ for (const pattern of patterns) {
55
+ const match = errorMessage.match(pattern);
56
+ if (match && match[1]) {
57
+ const port = parseInt(match[1], 10);
58
+ if (!isNaN(port) && port > 0 && port < 65536) {
59
+ logger.debug(`Extracted port ${port} using pattern: ${pattern}`);
60
+ return port;
61
+ }
62
+ }
63
+ }
64
+ logger.debug('No port found in error message');
65
+ return null;
66
+ }
67
+ /**
68
+ * Останавливает контейнер по ID
69
+ */
70
+ export async function stopContainerById(containerId) {
71
+ const docker = getDockerClient().getClient();
72
+ try {
73
+ const container = docker.getContainer(containerId);
74
+ const info = await container.inspect();
75
+ if (info.State.Running) {
76
+ logger.info(`Stopping container ${containerId.substring(0, 12)}...`);
77
+ await container.stop();
78
+ logger.info(`Container ${containerId.substring(0, 12)} stopped successfully`);
79
+ }
80
+ else {
81
+ logger.debug(`Container ${containerId.substring(0, 12)} is not running`);
82
+ }
83
+ }
84
+ catch (error) {
85
+ logger.error(`Failed to stop container ${containerId}:`, error);
86
+ throw new Error(`Failed to stop container: ${error.message}`);
87
+ }
88
+ }
89
+ //# sourceMappingURL=port-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-utils.js","sourceRoot":"","sources":["../../src/utils/port-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Workspace Root Management
3
+ * Хранит workspace root полученный от MCP клиента
4
+ */
5
+ /**
6
+ * Глобальное хранилище workspace root
7
+ * Устанавливается при инициализации MCP сервера через listRoots()
8
+ */
9
+ declare class WorkspaceManager {
10
+ private workspaceRoot;
11
+ /**
12
+ * Устанавливает workspace root из MCP client roots
13
+ */
14
+ setWorkspaceRoot(uri: string): void;
15
+ /**
16
+ * Возвращает workspace root или null если не установлен
17
+ */
18
+ getWorkspaceRoot(): string | null;
19
+ /**
20
+ * Проверяет, установлен ли workspace root
21
+ */
22
+ hasWorkspaceRoot(): boolean;
23
+ /**
24
+ * Парсит file:// URI в обычный путь
25
+ */
26
+ private parseFileUri;
27
+ /**
28
+ * Очищает workspace root (для тестов)
29
+ */
30
+ clear(): void;
31
+ }
32
+ export declare const workspaceManager: WorkspaceManager;
33
+ export {};
34
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,cAAM,gBAAgB;IACpB,OAAO,CAAC,aAAa,CAAuB;IAE5C;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOnC;;OAEG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Workspace Root Management
3
+ * Хранит workspace root полученный от MCP клиента
4
+ */
5
+ import { logger } from './logger.js';
6
+ /**
7
+ * Глобальное хранилище workspace root
8
+ * Устанавливается при инициализации MCP сервера через listRoots()
9
+ */
10
+ class WorkspaceManager {
11
+ workspaceRoot = null;
12
+ /**
13
+ * Устанавливает workspace root из MCP client roots
14
+ */
15
+ setWorkspaceRoot(uri) {
16
+ // URI в формате file:///path/to/workspace
17
+ const path = this.parseFileUri(uri);
18
+ this.workspaceRoot = path;
19
+ logger.info(`Workspace root set: ${path}`);
20
+ }
21
+ /**
22
+ * Возвращает workspace root или null если не установлен
23
+ */
24
+ getWorkspaceRoot() {
25
+ return this.workspaceRoot;
26
+ }
27
+ /**
28
+ * Проверяет, установлен ли workspace root
29
+ */
30
+ hasWorkspaceRoot() {
31
+ return this.workspaceRoot !== null;
32
+ }
33
+ /**
34
+ * Парсит file:// URI в обычный путь
35
+ */
36
+ parseFileUri(uri) {
37
+ if (uri.startsWith('file://')) {
38
+ // file:///path/to/workspace -> /path/to/workspace
39
+ return decodeURIComponent(uri.slice(7));
40
+ }
41
+ return uri;
42
+ }
43
+ /**
44
+ * Очищает workspace root (для тестов)
45
+ */
46
+ clear() {
47
+ this.workspaceRoot = null;
48
+ }
49
+ }
50
+ // Singleton instance
51
+ export const workspaceManager = new WorkspaceManager();
52
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,gBAAgB;IACZ,aAAa,GAAkB,IAAI,CAAC;IAE5C;;OAEG;IACH,gBAAgB,CAAC,GAAW;QAC1B,0CAA0C;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAW;QAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,kDAAkD;YAClD,OAAO,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;CACF;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hypnosis/docker-mcp-server",
3
- "version": "1.0.1",
3
+ "version": "1.0.4",
4
4
  "description": "Universal Docker MCP server for AI assistants (Cursor, Claude Desktop)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",