@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.
- package/README.md +15 -1
- package/dist/adapters/adapter-registry.d.ts +5 -5
- package/dist/adapters/adapter-registry.js +5 -5
- package/dist/adapters/database-adapter.d.ts +8 -8
- package/dist/adapters/database-adapter.js +1 -1
- package/dist/adapters/postgresql.d.ts +8 -8
- package/dist/adapters/postgresql.js +26 -26
- package/dist/adapters/postgresql.js.map +1 -1
- package/dist/adapters/redis.d.ts +9 -9
- package/dist/adapters/redis.js +23 -23
- package/dist/adapters/redis.js.map +1 -1
- package/dist/adapters/sqlite.d.ts +6 -6
- package/dist/adapters/sqlite.js +14 -14
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/types.d.ts +6 -6
- package/dist/adapters/types.js +1 -1
- package/dist/discovery/project-discovery.d.ts.map +1 -1
- package/dist/discovery/project-discovery.js +17 -3
- package/dist/discovery/project-discovery.js.map +1 -1
- package/dist/index.js +56 -18
- package/dist/index.js.map +1 -1
- package/dist/managers/compose-manager.d.ts.map +1 -1
- package/dist/managers/compose-manager.js +33 -4
- package/dist/managers/compose-manager.js.map +1 -1
- package/dist/managers/container-manager.d.ts +57 -13
- package/dist/managers/container-manager.d.ts.map +1 -1
- package/dist/managers/container-manager.js +140 -28
- package/dist/managers/container-manager.js.map +1 -1
- package/dist/tools/container-tools.d.ts +6 -4
- package/dist/tools/container-tools.d.ts.map +1 -1
- package/dist/tools/container-tools.js +87 -8
- package/dist/tools/container-tools.js.map +1 -1
- package/dist/tools/database-tools.d.ts +3 -3
- package/dist/tools/database-tools.js +4 -4
- package/dist/tools/database-tools.js.map +1 -1
- package/dist/tools/env-tools.d.ts +4 -4
- package/dist/tools/env-tools.js +9 -9
- package/dist/tools/env-tools.js.map +1 -1
- package/dist/tools/executor-tool.d.ts +3 -3
- package/dist/tools/executor-tool.js +6 -6
- package/dist/tools/executor-tool.js.map +1 -1
- package/dist/tools/mcp-health-tool.d.ts +4 -4
- package/dist/tools/mcp-health-tool.js +5 -5
- package/dist/tools/mcp-health-tool.js.map +1 -1
- package/dist/utils/compose-exec.d.ts.map +1 -1
- package/dist/utils/compose-exec.js +16 -1
- package/dist/utils/compose-exec.js.map +1 -1
- package/dist/utils/port-utils.d.ts +24 -0
- package/dist/utils/port-utils.d.ts.map +1 -0
- package/dist/utils/port-utils.js +89 -0
- package/dist/utils/port-utils.js.map +1 -0
- package/dist/utils/workspace.d.ts +34 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +52 -0
- package/dist/utils/workspace.js.map +1 -0
- 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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AASrC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC,SAAS,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,kDAAkD;QAClD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,KAAK,MAAM,aAAa,IAAI,UAAU,EAAE,CAAC;YACvC,6BAA6B;YAC7B,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;gBACxB,KAAK,MAAM,QAAQ,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;oBAC3C,sDAAsD;oBACtD,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;wBACjC,MAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC;wBACrC,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACjG,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,SAAS,CAAC;wBAEjD,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,KAAK,aAAa,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;wBAEtG,OAAO;4BACL,IAAI;4BACJ,WAAW;4BACX,aAAa;4BACb,MAAM;yBACP,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,YAAoB;IACvD,+EAA+E;IAC/E,MAAM,QAAQ,GAAG;QACf,wBAAwB,EAAG,0BAA0B;QACrD,kCAAkC,EAAG,mCAAmC;QACxE,+BAA+B,EAAG,gCAAgC;QAClE,gBAAgB,EAAG,4BAA4B;KAChD,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBAC7C,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,mBAAmB,OAAO,EAAE,CAAC,CAAC;gBACjE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC,SAAS,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QAEvC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,sBAAsB,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,aAAa,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,aAAa,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,4BAA4B,WAAW,GAAG,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|