@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.
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/adapters/adapter-registry.d.ts +29 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +47 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/database-adapter.d.ts +33 -0
- package/dist/adapters/database-adapter.d.ts.map +1 -0
- package/dist/adapters/database-adapter.js +6 -0
- package/dist/adapters/database-adapter.js.map +1 -0
- package/dist/adapters/postgresql.d.ts +42 -0
- package/dist/adapters/postgresql.d.ts.map +1 -0
- package/dist/adapters/postgresql.js +202 -0
- package/dist/adapters/postgresql.js.map +1 -0
- package/dist/adapters/redis.d.ts +46 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +202 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/adapters/sqlite.d.ts +34 -0
- package/dist/adapters/sqlite.d.ts.map +1 -0
- package/dist/adapters/sqlite.js +126 -0
- package/dist/adapters/sqlite.js.map +1 -0
- package/dist/adapters/types.d.ts +53 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +5 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +319 -0
- package/dist/cli.js.map +1 -0
- package/dist/discovery/compose-parser.d.ts +35 -0
- package/dist/discovery/compose-parser.d.ts.map +1 -0
- package/dist/discovery/compose-parser.js +126 -0
- package/dist/discovery/compose-parser.js.map +1 -0
- package/dist/discovery/config-merger.d.ts +19 -0
- package/dist/discovery/config-merger.d.ts.map +1 -0
- package/dist/discovery/config-merger.js +60 -0
- package/dist/discovery/config-merger.js.map +1 -0
- package/dist/discovery/project-discovery.d.ts +53 -0
- package/dist/discovery/project-discovery.d.ts.map +1 -0
- package/dist/discovery/project-discovery.js +252 -0
- package/dist/discovery/project-discovery.js.map +1 -0
- package/dist/discovery/types.d.ts +47 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +6 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/compose-manager.d.ts +30 -0
- package/dist/managers/compose-manager.d.ts.map +1 -0
- package/dist/managers/compose-manager.js +70 -0
- package/dist/managers/compose-manager.js.map +1 -0
- package/dist/managers/container-manager.d.ts +81 -0
- package/dist/managers/container-manager.d.ts.map +1 -0
- package/dist/managers/container-manager.js +278 -0
- package/dist/managers/container-manager.js.map +1 -0
- package/dist/managers/env-manager.d.ts +37 -0
- package/dist/managers/env-manager.d.ts.map +1 -0
- package/dist/managers/env-manager.js +124 -0
- package/dist/managers/env-manager.js.map +1 -0
- package/dist/security/sql-validator.d.ts +23 -0
- package/dist/security/sql-validator.d.ts.map +1 -0
- package/dist/security/sql-validator.js +44 -0
- package/dist/security/sql-validator.js.map +1 -0
- package/dist/tools/container-tools.d.ts +31 -0
- package/dist/tools/container-tools.d.ts.map +1 -0
- package/dist/tools/container-tools.js +366 -0
- package/dist/tools/container-tools.js.map +1 -0
- package/dist/tools/database-tools.d.ts +22 -0
- package/dist/tools/database-tools.d.ts.map +1 -0
- package/dist/tools/database-tools.js +264 -0
- package/dist/tools/database-tools.js.map +1 -0
- package/dist/tools/env-tools.d.ts +52 -0
- package/dist/tools/env-tools.d.ts.map +1 -0
- package/dist/tools/env-tools.js +318 -0
- package/dist/tools/env-tools.js.map +1 -0
- package/dist/tools/executor-tool.d.ts +18 -0
- package/dist/tools/executor-tool.d.ts.map +1 -0
- package/dist/tools/executor-tool.js +95 -0
- package/dist/tools/executor-tool.js.map +1 -0
- package/dist/tools/mcp-health-tool.d.ts +65 -0
- package/dist/tools/mcp-health-tool.d.ts.map +1 -0
- package/dist/tools/mcp-health-tool.js +126 -0
- package/dist/tools/mcp-health-tool.js.map +1 -0
- package/dist/utils/cache.d.ts +43 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +77 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/compose-exec.d.ts +13 -0
- package/dist/utils/compose-exec.d.ts.map +1 -0
- package/dist/utils/compose-exec.js +33 -0
- package/dist/utils/compose-exec.js.map +1 -0
- package/dist/utils/docker-client.d.ts +33 -0
- package/dist/utils/docker-client.d.ts.map +1 -0
- package/dist/utils/docker-client.js +59 -0
- package/dist/utils/docker-client.js.map +1 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Tools
|
|
3
|
+
* MCP Tools для работы с environment variables и конфигурацией
|
|
4
|
+
*/
|
|
5
|
+
import { CallToolRequest, Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
export declare class EnvTools {
|
|
7
|
+
private envManager;
|
|
8
|
+
private projectDiscovery;
|
|
9
|
+
private containerManager;
|
|
10
|
+
private composeParser;
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Регистрация всех environment tools
|
|
14
|
+
*/
|
|
15
|
+
getTools(): Tool[];
|
|
16
|
+
/**
|
|
17
|
+
* Обработка вызовов tools
|
|
18
|
+
*/
|
|
19
|
+
handleCall(request: CallToolRequest): Promise<{
|
|
20
|
+
content: {
|
|
21
|
+
type: string;
|
|
22
|
+
text: string;
|
|
23
|
+
}[];
|
|
24
|
+
} | {
|
|
25
|
+
content: {
|
|
26
|
+
type: string;
|
|
27
|
+
text: string;
|
|
28
|
+
}[];
|
|
29
|
+
isError: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Получить проект (helper)
|
|
33
|
+
*/
|
|
34
|
+
private getProject;
|
|
35
|
+
/**
|
|
36
|
+
* docker_env_list handler
|
|
37
|
+
*/
|
|
38
|
+
private handleEnvList;
|
|
39
|
+
/**
|
|
40
|
+
* docker_compose_config handler
|
|
41
|
+
*/
|
|
42
|
+
private handleComposeConfig;
|
|
43
|
+
/**
|
|
44
|
+
* docker_healthcheck handler
|
|
45
|
+
*/
|
|
46
|
+
private handleHealthcheck;
|
|
47
|
+
/**
|
|
48
|
+
* Вычислить общий статус здоровья
|
|
49
|
+
*/
|
|
50
|
+
private calculateOverallStatus;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=env-tools.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Tools
|
|
3
|
+
* MCP Tools для работы с environment variables и конфигурацией
|
|
4
|
+
*/
|
|
5
|
+
import { EnvManager } from '../managers/env-manager.js';
|
|
6
|
+
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
7
|
+
import { ContainerManager } from '../managers/container-manager.js';
|
|
8
|
+
import { ComposeParser } from '../discovery/compose-parser.js';
|
|
9
|
+
import { ComposeExec } from '../utils/compose-exec.js';
|
|
10
|
+
import { stringify as stringifyYaml } from 'yaml';
|
|
11
|
+
import { logger } from '../utils/logger.js';
|
|
12
|
+
export class EnvTools {
|
|
13
|
+
envManager;
|
|
14
|
+
projectDiscovery;
|
|
15
|
+
containerManager;
|
|
16
|
+
composeParser;
|
|
17
|
+
constructor() {
|
|
18
|
+
this.envManager = new EnvManager();
|
|
19
|
+
this.projectDiscovery = new ProjectDiscovery();
|
|
20
|
+
this.containerManager = new ContainerManager();
|
|
21
|
+
this.composeParser = new ComposeParser();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Регистрация всех environment tools
|
|
25
|
+
*/
|
|
26
|
+
getTools() {
|
|
27
|
+
return [
|
|
28
|
+
{
|
|
29
|
+
name: 'docker_env_list',
|
|
30
|
+
description: 'List environment variables from .env files and docker-compose.yml',
|
|
31
|
+
inputSchema: {
|
|
32
|
+
type: 'object',
|
|
33
|
+
properties: {
|
|
34
|
+
project: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Project name (auto-detected if not provided)',
|
|
37
|
+
},
|
|
38
|
+
maskSecrets: {
|
|
39
|
+
type: 'boolean',
|
|
40
|
+
description: 'Mask sensitive values (passwords, tokens, etc.). Default: true',
|
|
41
|
+
default: true,
|
|
42
|
+
},
|
|
43
|
+
service: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Show env for specific service only',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'docker_compose_config',
|
|
52
|
+
description: 'Show parsed docker-compose configuration',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
project: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'Project name (auto-detected if not provided)',
|
|
59
|
+
},
|
|
60
|
+
services: {
|
|
61
|
+
type: 'array',
|
|
62
|
+
items: {
|
|
63
|
+
type: 'string',
|
|
64
|
+
},
|
|
65
|
+
description: 'Show config for specific services only',
|
|
66
|
+
},
|
|
67
|
+
resolve: {
|
|
68
|
+
type: 'boolean',
|
|
69
|
+
description: 'Resolve variables using docker-compose config CLI. Default: false',
|
|
70
|
+
default: false,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'docker_healthcheck',
|
|
77
|
+
description: 'Check health status of all services',
|
|
78
|
+
inputSchema: {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: {
|
|
81
|
+
project: {
|
|
82
|
+
type: 'string',
|
|
83
|
+
description: 'Project name (auto-detected if not provided)',
|
|
84
|
+
},
|
|
85
|
+
services: {
|
|
86
|
+
type: 'array',
|
|
87
|
+
items: {
|
|
88
|
+
type: 'string',
|
|
89
|
+
},
|
|
90
|
+
description: 'Check specific services only',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Обработка вызовов tools
|
|
99
|
+
*/
|
|
100
|
+
async handleCall(request) {
|
|
101
|
+
const { name, arguments: args } = request.params;
|
|
102
|
+
try {
|
|
103
|
+
switch (name) {
|
|
104
|
+
case 'docker_env_list':
|
|
105
|
+
return await this.handleEnvList(args);
|
|
106
|
+
case 'docker_compose_config':
|
|
107
|
+
return await this.handleComposeConfig(args);
|
|
108
|
+
case 'docker_healthcheck':
|
|
109
|
+
return await this.handleHealthcheck(args);
|
|
110
|
+
default:
|
|
111
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
logger.error(`Tool ${name} failed:`, error);
|
|
116
|
+
return {
|
|
117
|
+
content: [
|
|
118
|
+
{
|
|
119
|
+
type: 'text',
|
|
120
|
+
text: `Error: ${error.message}`,
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
isError: true,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Получить проект (helper)
|
|
129
|
+
*/
|
|
130
|
+
async getProject(projectName) {
|
|
131
|
+
return await this.projectDiscovery.findProject(projectName ? { explicitPath: projectName } : {});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* docker_env_list handler
|
|
135
|
+
*/
|
|
136
|
+
async handleEnvList(args) {
|
|
137
|
+
const project = await this.getProject(args?.project);
|
|
138
|
+
// Если указан service, загружаем env для конкретного сервиса
|
|
139
|
+
let env;
|
|
140
|
+
if (args?.service) {
|
|
141
|
+
const serviceConfig = project.services[args.service];
|
|
142
|
+
if (!serviceConfig) {
|
|
143
|
+
throw new Error(`Service '${args.service}' not found in project '${project.name}'. ` +
|
|
144
|
+
`Available services: ${Object.keys(project.services).join(', ')}`);
|
|
145
|
+
}
|
|
146
|
+
env = this.envManager.loadEnv(project.projectDir, args.service, serviceConfig);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Загружаем глобальный env (без service)
|
|
150
|
+
env = this.envManager.loadEnv(project.projectDir);
|
|
151
|
+
}
|
|
152
|
+
// Маскировать секреты (по умолчанию true)
|
|
153
|
+
const shouldMask = args?.maskSecrets !== false;
|
|
154
|
+
const result = shouldMask ? this.envManager.maskSecrets(env) : env;
|
|
155
|
+
// Подсчитываем количество замаскированных секретов
|
|
156
|
+
let maskedCount = 0;
|
|
157
|
+
if (shouldMask) {
|
|
158
|
+
for (const [key, value] of Object.entries(result)) {
|
|
159
|
+
if (value === '***MASKED***') {
|
|
160
|
+
maskedCount++;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Форматируем результат
|
|
165
|
+
const output = Object.entries(result)
|
|
166
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
167
|
+
.join('\n');
|
|
168
|
+
const summary = shouldMask && maskedCount > 0
|
|
169
|
+
? `\n\n🔒 ${maskedCount} secret(s) masked`
|
|
170
|
+
: '';
|
|
171
|
+
return {
|
|
172
|
+
content: [
|
|
173
|
+
{
|
|
174
|
+
type: 'text',
|
|
175
|
+
text: `Environment Variables:\n${output}${summary}`,
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* docker_compose_config handler
|
|
182
|
+
*/
|
|
183
|
+
async handleComposeConfig(args) {
|
|
184
|
+
const project = await this.getProject(args?.project);
|
|
185
|
+
const shouldResolve = args?.resolve === true;
|
|
186
|
+
let output;
|
|
187
|
+
if (shouldResolve) {
|
|
188
|
+
// Использовать CLI для полного resolve
|
|
189
|
+
logger.debug('Using docker-compose config CLI for resolved config');
|
|
190
|
+
// Примечание: docker-compose config не поддерживает фильтрацию по services
|
|
191
|
+
// Показываем весь config
|
|
192
|
+
if (args?.services && Array.isArray(args.services)) {
|
|
193
|
+
logger.warn('Filtering by services is not supported with resolve=true. Showing full config.');
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
output = ComposeExec.run(project.composeFile, ['config'], {
|
|
197
|
+
cwd: project.projectDir,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
throw new Error(`Failed to get resolved config: ${error.message}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Использовать parsed config (быстро, без resolve)
|
|
206
|
+
logger.debug('Using parsed config (no resolve)');
|
|
207
|
+
const rawConfig = this.composeParser.parseRaw(project.composeFile);
|
|
208
|
+
// Фильтровать по services если указано
|
|
209
|
+
if (args?.services && Array.isArray(args.services)) {
|
|
210
|
+
const filteredConfig = {
|
|
211
|
+
...rawConfig,
|
|
212
|
+
services: {},
|
|
213
|
+
};
|
|
214
|
+
for (const serviceName of args.services) {
|
|
215
|
+
if (rawConfig.services && rawConfig.services[serviceName]) {
|
|
216
|
+
filteredConfig.services[serviceName] = rawConfig.services[serviceName];
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
throw new Error(`Service '${serviceName}' not found in project '${project.name}'. ` +
|
|
220
|
+
`Available services: ${Object.keys(rawConfig.services || {}).join(', ')}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
output = stringifyYaml(filteredConfig);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// Показать весь config
|
|
227
|
+
output = stringifyYaml(rawConfig);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
content: [
|
|
232
|
+
{
|
|
233
|
+
type: 'text',
|
|
234
|
+
text: output,
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* docker_healthcheck handler
|
|
241
|
+
*/
|
|
242
|
+
async handleHealthcheck(args) {
|
|
243
|
+
const project = await this.getProject(args?.project);
|
|
244
|
+
// Получить список всех контейнеров
|
|
245
|
+
const containers = await this.containerManager.listContainers(project.name);
|
|
246
|
+
// Фильтровать по services если указано
|
|
247
|
+
let servicesToCheck;
|
|
248
|
+
if (args?.services && Array.isArray(args.services)) {
|
|
249
|
+
servicesToCheck = args.services;
|
|
250
|
+
// Проверить что все указанные сервисы существуют
|
|
251
|
+
const availableServices = containers.map(c => c.service);
|
|
252
|
+
for (const serviceName of servicesToCheck) {
|
|
253
|
+
if (!availableServices.includes(serviceName)) {
|
|
254
|
+
throw new Error(`Service '${serviceName}' not found in project '${project.name}'. ` +
|
|
255
|
+
`Available services: ${availableServices.join(', ')}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// Проверяем все сервисы
|
|
261
|
+
servicesToCheck = containers.map(c => c.service);
|
|
262
|
+
}
|
|
263
|
+
// Получить health status для каждого сервиса
|
|
264
|
+
const serviceStatuses = await Promise.all(servicesToCheck.map(async (serviceName) => {
|
|
265
|
+
try {
|
|
266
|
+
const health = await this.containerManager.getHealthStatus(serviceName, project.name, project.composeFile, project.projectDir);
|
|
267
|
+
return {
|
|
268
|
+
name: serviceName,
|
|
269
|
+
status: health.status,
|
|
270
|
+
checks: health.checks,
|
|
271
|
+
failures: health.failures,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
logger.error(`Failed to get health for ${serviceName}:`, error);
|
|
276
|
+
return {
|
|
277
|
+
name: serviceName,
|
|
278
|
+
status: 'none',
|
|
279
|
+
checks: 0,
|
|
280
|
+
failures: 0,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
}));
|
|
284
|
+
// Вычислить overall status
|
|
285
|
+
const overallStatus = this.calculateOverallStatus(serviceStatuses);
|
|
286
|
+
// Форматировать результат
|
|
287
|
+
const result = {
|
|
288
|
+
overall: overallStatus,
|
|
289
|
+
services: serviceStatuses,
|
|
290
|
+
};
|
|
291
|
+
return {
|
|
292
|
+
content: [
|
|
293
|
+
{
|
|
294
|
+
type: 'text',
|
|
295
|
+
text: JSON.stringify(result, null, 2),
|
|
296
|
+
},
|
|
297
|
+
],
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Вычислить общий статус здоровья
|
|
302
|
+
*/
|
|
303
|
+
calculateOverallStatus(serviceStatuses) {
|
|
304
|
+
const hasUnhealthy = serviceStatuses.some(s => s.status === 'unhealthy');
|
|
305
|
+
if (hasUnhealthy) {
|
|
306
|
+
return 'unhealthy';
|
|
307
|
+
}
|
|
308
|
+
const hasFailures = serviceStatuses.some(s => s.failures > 0);
|
|
309
|
+
const hasStarting = serviceStatuses.some(s => s.status === 'starting');
|
|
310
|
+
const hasNotRunning = serviceStatuses.some(s => s.status === 'not_running');
|
|
311
|
+
if (hasFailures || hasStarting || hasNotRunning) {
|
|
312
|
+
return 'degraded';
|
|
313
|
+
}
|
|
314
|
+
// Все healthy или none (none считается OK если контейнер running)
|
|
315
|
+
return 'healthy';
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=env-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-tools.js","sourceRoot":"","sources":["../../src/tools/env-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Executor Tool
|
|
3
|
+
* Выполнение любых команд в контейнере через docker exec
|
|
4
|
+
*/
|
|
5
|
+
import { Tool, CallToolRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
export declare class ExecutorTool {
|
|
7
|
+
private containerManager;
|
|
8
|
+
private projectDiscovery;
|
|
9
|
+
constructor();
|
|
10
|
+
getTool(): Tool;
|
|
11
|
+
handleCall(request: CallToolRequest): Promise<any>;
|
|
12
|
+
/**
|
|
13
|
+
* Простой парсинг command string → array
|
|
14
|
+
* TODO: улучшить для quoted strings в будущем
|
|
15
|
+
*/
|
|
16
|
+
private parseCommand;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=executor-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-tool.d.ts","sourceRoot":"","sources":["../../src/tools/executor-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAK3E,qBAAa,YAAY;IACvB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;;IAO3C,OAAO,IAAI,IAAI;IAkCT,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IAwDxD;;;OAGG;IACH,OAAO,CAAC,YAAY;CAKrB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Executor Tool
|
|
3
|
+
* Выполнение любых команд в контейнере через docker exec
|
|
4
|
+
*/
|
|
5
|
+
import { ContainerManager } from '../managers/container-manager.js';
|
|
6
|
+
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
export class ExecutorTool {
|
|
9
|
+
containerManager;
|
|
10
|
+
projectDiscovery;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.containerManager = new ContainerManager();
|
|
13
|
+
this.projectDiscovery = new ProjectDiscovery();
|
|
14
|
+
}
|
|
15
|
+
getTool() {
|
|
16
|
+
return {
|
|
17
|
+
name: 'docker_exec',
|
|
18
|
+
description: 'Execute any command in a container. Examples: "npm test", "pytest tests/", "alembic upgrade head", "python manage.py migrate"',
|
|
19
|
+
inputSchema: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
properties: {
|
|
22
|
+
service: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Service name from docker-compose.yml',
|
|
25
|
+
},
|
|
26
|
+
command: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'Command to execute (e.g., "npm test", "pytest tests/", "alembic upgrade head")',
|
|
29
|
+
},
|
|
30
|
+
user: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Run as specific user (optional)',
|
|
33
|
+
},
|
|
34
|
+
workdir: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Working directory (optional)',
|
|
37
|
+
},
|
|
38
|
+
interactive: {
|
|
39
|
+
type: 'boolean',
|
|
40
|
+
description: 'Interactive mode (TTY) for REPL, bash, etc.',
|
|
41
|
+
default: false,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
required: ['service', 'command'],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async handleCall(request) {
|
|
49
|
+
const args = request.params.arguments;
|
|
50
|
+
try {
|
|
51
|
+
if (!args || !args.service || !args.command) {
|
|
52
|
+
throw new Error('service and command parameters are required');
|
|
53
|
+
}
|
|
54
|
+
const project = await this.projectDiscovery.findProject();
|
|
55
|
+
// Парсим command string в array
|
|
56
|
+
const commandParts = this.parseCommand(args.command);
|
|
57
|
+
logger.info(`Executing in ${args.service}: ${args.command}`);
|
|
58
|
+
const output = await this.containerManager.exec(args.service, project.name, commandParts, {
|
|
59
|
+
user: args.user,
|
|
60
|
+
workdir: args.workdir,
|
|
61
|
+
interactive: args.interactive || false,
|
|
62
|
+
}, project.composeFile, project.projectDir);
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: 'text',
|
|
67
|
+
text: output,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.error('docker_exec failed:', error);
|
|
74
|
+
return {
|
|
75
|
+
content: [
|
|
76
|
+
{
|
|
77
|
+
type: 'text',
|
|
78
|
+
text: `Error: ${error.message}`,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
isError: true,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Простой парсинг command string → array
|
|
87
|
+
* TODO: улучшить для quoted strings в будущем
|
|
88
|
+
*/
|
|
89
|
+
parseCommand(command) {
|
|
90
|
+
// Простой split по пробелам
|
|
91
|
+
// В будущем можно добавить поддержку quoted strings
|
|
92
|
+
return command.split(' ').filter((s) => s.length > 0);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=executor-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-tool.js","sourceRoot":"","sources":["../../src/tools/executor-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,YAAY;IACf,gBAAgB,CAAmB;IACnC,gBAAgB,CAAmB;IAE3C;QACE,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACjD,CAAC;IAED,OAAO;QACL,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,+HAA+H;YAC5I,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,sCAAsC;qBACpD;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,gFAAgF;qBAC9F;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iCAAiC;qBAC/C;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,8BAA8B;qBAC5C;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,6CAA6C;wBAC1D,OAAO,EAAE,KAAK;qBACf;iBACF;gBACD,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;aACjC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAwB;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAM3B,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;YAE1D,gCAAgC;YAChC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErD,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAC7C,IAAI,CAAC,OAAO,EACZ,OAAO,CAAC,IAAI,EACZ,YAAY,EACZ;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,KAAK;aACvC,EACD,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,UAAU,CACnB,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC3C,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;IAED;;;OAGG;IACK,YAAY,CAAC,OAAe;QAClC,4BAA4B;QAC5B,oDAAoD;QACpD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Health Tool
|
|
3
|
+
* Самодиагностика MCP сервера
|
|
4
|
+
*/
|
|
5
|
+
import { CallToolRequest, Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
export declare class MCPHealthTool {
|
|
7
|
+
/**
|
|
8
|
+
* Регистрация health tool
|
|
9
|
+
*/
|
|
10
|
+
getTool(): Tool;
|
|
11
|
+
/**
|
|
12
|
+
* Обработка вызова tool
|
|
13
|
+
*/
|
|
14
|
+
handleCall(request: CallToolRequest): Promise<{
|
|
15
|
+
content: {
|
|
16
|
+
type: string;
|
|
17
|
+
text: string;
|
|
18
|
+
}[];
|
|
19
|
+
isError?: undefined;
|
|
20
|
+
} | {
|
|
21
|
+
content: {
|
|
22
|
+
type: string;
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
isError: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Выполнить проверки здоровья
|
|
29
|
+
*/
|
|
30
|
+
check(): Promise<{
|
|
31
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
32
|
+
timestamp: string;
|
|
33
|
+
uptime: number;
|
|
34
|
+
checks: {
|
|
35
|
+
docker: {
|
|
36
|
+
status: 'ok' | 'failed';
|
|
37
|
+
message?: string;
|
|
38
|
+
latency?: number;
|
|
39
|
+
};
|
|
40
|
+
discovery: {
|
|
41
|
+
status: 'ok' | 'failed';
|
|
42
|
+
message?: string;
|
|
43
|
+
projectFound?: boolean;
|
|
44
|
+
projectName?: string;
|
|
45
|
+
};
|
|
46
|
+
adapters: {
|
|
47
|
+
status: 'ok';
|
|
48
|
+
registered: string[];
|
|
49
|
+
count: number;
|
|
50
|
+
};
|
|
51
|
+
cache: {
|
|
52
|
+
status: 'ok';
|
|
53
|
+
size: number;
|
|
54
|
+
ttl: number;
|
|
55
|
+
};
|
|
56
|
+
memory: {
|
|
57
|
+
status: 'ok' | 'warning';
|
|
58
|
+
heapUsed: number;
|
|
59
|
+
heapTotal: number;
|
|
60
|
+
rss: number;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
}>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=mcp-health-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-health-tool.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-health-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,IAAI,EACL,MAAM,oCAAoC,CAAC;AAO5C,qBAAa,aAAa;IACxB;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,eAAe;;;;;;;;;;;;;IA0BzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QACrB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;QAC7C,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC;gBACxB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC;gBACxB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,YAAY,CAAC,EAAE,OAAO,CAAC;gBACvB,WAAW,CAAC,EAAE,MAAM,CAAC;aACtB,CAAC;YACF,QAAQ,EAAE;gBACR,MAAM,EAAE,IAAI,CAAC;gBACb,UAAU,EAAE,MAAM,EAAE,CAAC;gBACrB,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,GAAG,EAAE,MAAM,CAAC;aACb,CAAC;YACF,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;gBACzB,QAAQ,EAAE,MAAM,CAAC;gBACjB,SAAS,EAAE,MAAM,CAAC;gBAClB,GAAG,EAAE,MAAM,CAAC;aACb,CAAC;SACH,CAAC;KACH,CAAC;CAkFH"}
|