@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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/adapters/adapter-registry.d.ts +29 -0
  4. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  5. package/dist/adapters/adapter-registry.js +47 -0
  6. package/dist/adapters/adapter-registry.js.map +1 -0
  7. package/dist/adapters/database-adapter.d.ts +33 -0
  8. package/dist/adapters/database-adapter.d.ts.map +1 -0
  9. package/dist/adapters/database-adapter.js +6 -0
  10. package/dist/adapters/database-adapter.js.map +1 -0
  11. package/dist/adapters/postgresql.d.ts +42 -0
  12. package/dist/adapters/postgresql.d.ts.map +1 -0
  13. package/dist/adapters/postgresql.js +202 -0
  14. package/dist/adapters/postgresql.js.map +1 -0
  15. package/dist/adapters/redis.d.ts +46 -0
  16. package/dist/adapters/redis.d.ts.map +1 -0
  17. package/dist/adapters/redis.js +202 -0
  18. package/dist/adapters/redis.js.map +1 -0
  19. package/dist/adapters/sqlite.d.ts +34 -0
  20. package/dist/adapters/sqlite.d.ts.map +1 -0
  21. package/dist/adapters/sqlite.js +126 -0
  22. package/dist/adapters/sqlite.js.map +1 -0
  23. package/dist/adapters/types.d.ts +53 -0
  24. package/dist/adapters/types.d.ts.map +1 -0
  25. package/dist/adapters/types.js +5 -0
  26. package/dist/adapters/types.js.map +1 -0
  27. package/dist/cli.d.ts +7 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +319 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/discovery/compose-parser.d.ts +35 -0
  32. package/dist/discovery/compose-parser.d.ts.map +1 -0
  33. package/dist/discovery/compose-parser.js +126 -0
  34. package/dist/discovery/compose-parser.js.map +1 -0
  35. package/dist/discovery/config-merger.d.ts +19 -0
  36. package/dist/discovery/config-merger.d.ts.map +1 -0
  37. package/dist/discovery/config-merger.js +60 -0
  38. package/dist/discovery/config-merger.js.map +1 -0
  39. package/dist/discovery/project-discovery.d.ts +53 -0
  40. package/dist/discovery/project-discovery.d.ts.map +1 -0
  41. package/dist/discovery/project-discovery.js +252 -0
  42. package/dist/discovery/project-discovery.js.map +1 -0
  43. package/dist/discovery/types.d.ts +47 -0
  44. package/dist/discovery/types.d.ts.map +1 -0
  45. package/dist/discovery/types.js +6 -0
  46. package/dist/discovery/types.js.map +1 -0
  47. package/dist/index.d.ts +6 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +109 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/managers/compose-manager.d.ts +30 -0
  52. package/dist/managers/compose-manager.d.ts.map +1 -0
  53. package/dist/managers/compose-manager.js +70 -0
  54. package/dist/managers/compose-manager.js.map +1 -0
  55. package/dist/managers/container-manager.d.ts +81 -0
  56. package/dist/managers/container-manager.d.ts.map +1 -0
  57. package/dist/managers/container-manager.js +278 -0
  58. package/dist/managers/container-manager.js.map +1 -0
  59. package/dist/managers/env-manager.d.ts +37 -0
  60. package/dist/managers/env-manager.d.ts.map +1 -0
  61. package/dist/managers/env-manager.js +124 -0
  62. package/dist/managers/env-manager.js.map +1 -0
  63. package/dist/security/sql-validator.d.ts +23 -0
  64. package/dist/security/sql-validator.d.ts.map +1 -0
  65. package/dist/security/sql-validator.js +44 -0
  66. package/dist/security/sql-validator.js.map +1 -0
  67. package/dist/tools/container-tools.d.ts +31 -0
  68. package/dist/tools/container-tools.d.ts.map +1 -0
  69. package/dist/tools/container-tools.js +366 -0
  70. package/dist/tools/container-tools.js.map +1 -0
  71. package/dist/tools/database-tools.d.ts +22 -0
  72. package/dist/tools/database-tools.d.ts.map +1 -0
  73. package/dist/tools/database-tools.js +264 -0
  74. package/dist/tools/database-tools.js.map +1 -0
  75. package/dist/tools/env-tools.d.ts +52 -0
  76. package/dist/tools/env-tools.d.ts.map +1 -0
  77. package/dist/tools/env-tools.js +318 -0
  78. package/dist/tools/env-tools.js.map +1 -0
  79. package/dist/tools/executor-tool.d.ts +18 -0
  80. package/dist/tools/executor-tool.d.ts.map +1 -0
  81. package/dist/tools/executor-tool.js +95 -0
  82. package/dist/tools/executor-tool.js.map +1 -0
  83. package/dist/tools/mcp-health-tool.d.ts +65 -0
  84. package/dist/tools/mcp-health-tool.d.ts.map +1 -0
  85. package/dist/tools/mcp-health-tool.js +126 -0
  86. package/dist/tools/mcp-health-tool.js.map +1 -0
  87. package/dist/utils/cache.d.ts +43 -0
  88. package/dist/utils/cache.d.ts.map +1 -0
  89. package/dist/utils/cache.js +77 -0
  90. package/dist/utils/cache.js.map +1 -0
  91. package/dist/utils/compose-exec.d.ts +13 -0
  92. package/dist/utils/compose-exec.d.ts.map +1 -0
  93. package/dist/utils/compose-exec.js +33 -0
  94. package/dist/utils/compose-exec.js.map +1 -0
  95. package/dist/utils/docker-client.d.ts +33 -0
  96. package/dist/utils/docker-client.d.ts.map +1 -0
  97. package/dist/utils/docker-client.js +59 -0
  98. package/dist/utils/docker-client.js.map +1 -0
  99. package/dist/utils/logger.d.ts +18 -0
  100. package/dist/utils/logger.d.ts.map +1 -0
  101. package/dist/utils/logger.js +38 -0
  102. package/dist/utils/logger.js.map +1 -0
  103. 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":"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"}
@@ -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"}