@fractalizer/mcp-cli 0.3.18 → 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 (120) hide show
  1. package/README.md +158 -266
  2. package/dist/commands/connect.command.d.ts +18 -15
  3. package/dist/commands/connect.command.d.ts.map +1 -1
  4. package/dist/commands/connect.command.js +66 -40
  5. package/dist/commands/connect.command.js.map +1 -1
  6. package/dist/commands/disconnect.command.d.ts +5 -17
  7. package/dist/commands/disconnect.command.d.ts.map +1 -1
  8. package/dist/commands/disconnect.command.js +4 -15
  9. package/dist/commands/disconnect.command.js.map +1 -1
  10. package/dist/commands/doctor.command.d.ts +34 -0
  11. package/dist/commands/doctor.command.d.ts.map +1 -0
  12. package/dist/commands/doctor.command.js +321 -0
  13. package/dist/commands/doctor.command.js.map +1 -0
  14. package/dist/commands/index.d.ts +1 -0
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +2 -0
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/commands/list.command.d.ts +4 -9
  19. package/dist/commands/list.command.d.ts.map +1 -1
  20. package/dist/commands/list.command.js +1 -5
  21. package/dist/commands/list.command.js.map +1 -1
  22. package/dist/commands/status.command.d.ts +6 -13
  23. package/dist/commands/status.command.d.ts.map +1 -1
  24. package/dist/commands/status.command.js +15 -12
  25. package/dist/commands/status.command.js.map +1 -1
  26. package/dist/commands/validate.command.d.ts +6 -11
  27. package/dist/commands/validate.command.d.ts.map +1 -1
  28. package/dist/commands/validate.command.js +15 -19
  29. package/dist/commands/validate.command.js.map +1 -1
  30. package/dist/connectors/base/base-connector.d.ts +31 -55
  31. package/dist/connectors/base/base-connector.d.ts.map +1 -1
  32. package/dist/connectors/base/base-connector.js +71 -57
  33. package/dist/connectors/base/base-connector.js.map +1 -1
  34. package/dist/connectors/base/configurable-connector.d.ts +89 -24
  35. package/dist/connectors/base/configurable-connector.d.ts.map +1 -1
  36. package/dist/connectors/base/configurable-connector.js +266 -23
  37. package/dist/connectors/base/configurable-connector.js.map +1 -1
  38. package/dist/connectors/base/connector.interface.d.ts +29 -20
  39. package/dist/connectors/base/connector.interface.d.ts.map +1 -1
  40. package/dist/connectors/base/index.d.ts +0 -1
  41. package/dist/connectors/base/index.d.ts.map +1 -1
  42. package/dist/connectors/base/index.js +0 -1
  43. package/dist/connectors/base/index.js.map +1 -1
  44. package/dist/connectors/claude-code/claude-code.connector.d.ts +100 -21
  45. package/dist/connectors/claude-code/claude-code.connector.d.ts.map +1 -1
  46. package/dist/connectors/claude-code/claude-code.connector.js +221 -40
  47. package/dist/connectors/claude-code/claude-code.connector.js.map +1 -1
  48. package/dist/connectors/connector-factory.d.ts +15 -15
  49. package/dist/connectors/connector-factory.d.ts.map +1 -1
  50. package/dist/connectors/connector-factory.js +61 -18
  51. package/dist/connectors/connector-factory.js.map +1 -1
  52. package/dist/connectors/index.d.ts +0 -4
  53. package/dist/connectors/index.d.ts.map +1 -1
  54. package/dist/connectors/index.js +2 -8
  55. package/dist/connectors/index.js.map +1 -1
  56. package/dist/connectors/registry.d.ts +20 -27
  57. package/dist/connectors/registry.d.ts.map +1 -1
  58. package/dist/connectors/registry.js +34 -34
  59. package/dist/connectors/registry.js.map +1 -1
  60. package/dist/tsconfig.tsbuildinfo +1 -1
  61. package/dist/types/{base.types.d.ts → client.types.d.ts} +30 -30
  62. package/dist/types/client.types.d.ts.map +1 -0
  63. package/dist/types/client.types.js +6 -0
  64. package/dist/types/client.types.js.map +1 -0
  65. package/dist/types/doctor.types.d.ts +91 -0
  66. package/dist/types/doctor.types.d.ts.map +1 -0
  67. package/dist/types/doctor.types.js +12 -0
  68. package/dist/types/doctor.types.js.map +1 -0
  69. package/dist/types/launch.types.d.ts +59 -0
  70. package/dist/types/launch.types.d.ts.map +1 -0
  71. package/dist/types/launch.types.js +6 -0
  72. package/dist/types/launch.types.js.map +1 -0
  73. package/dist/types.d.ts +23 -14
  74. package/dist/types.d.ts.map +1 -1
  75. package/dist/types.js +9 -2
  76. package/dist/types.js.map +1 -1
  77. package/dist/utils/command-executor.d.ts +39 -3
  78. package/dist/utils/command-executor.d.ts.map +1 -1
  79. package/dist/utils/command-executor.js +95 -8
  80. package/dist/utils/command-executor.js.map +1 -1
  81. package/dist/utils/config-manager.d.ts +25 -42
  82. package/dist/utils/config-manager.d.ts.map +1 -1
  83. package/dist/utils/config-manager.js +21 -49
  84. package/dist/utils/config-manager.js.map +1 -1
  85. package/dist/utils/index.d.ts +1 -0
  86. package/dist/utils/index.d.ts.map +1 -1
  87. package/dist/utils/index.js +1 -0
  88. package/dist/utils/index.js.map +1 -1
  89. package/dist/utils/interactive-prompter.d.ts +16 -64
  90. package/dist/utils/interactive-prompter.d.ts.map +1 -1
  91. package/dist/utils/interactive-prompter.js +12 -65
  92. package/dist/utils/interactive-prompter.js.map +1 -1
  93. package/dist/utils/launch-spec-helpers.d.ts +38 -0
  94. package/dist/utils/launch-spec-helpers.d.ts.map +1 -0
  95. package/dist/utils/launch-spec-helpers.js +131 -0
  96. package/dist/utils/launch-spec-helpers.js.map +1 -0
  97. package/package.json +2 -2
  98. package/dist/connectors/base/file-based-connector.d.ts +0 -97
  99. package/dist/connectors/base/file-based-connector.d.ts.map +0 -1
  100. package/dist/connectors/base/file-based-connector.js +0 -185
  101. package/dist/connectors/base/file-based-connector.js.map +0 -1
  102. package/dist/connectors/claude-desktop/claude-desktop.connector.d.ts +0 -38
  103. package/dist/connectors/claude-desktop/claude-desktop.connector.d.ts.map +0 -1
  104. package/dist/connectors/claude-desktop/claude-desktop.connector.js +0 -68
  105. package/dist/connectors/claude-desktop/claude-desktop.connector.js.map +0 -1
  106. package/dist/connectors/codex/codex.connector.d.ts +0 -51
  107. package/dist/connectors/codex/codex.connector.d.ts.map +0 -1
  108. package/dist/connectors/codex/codex.connector.js +0 -76
  109. package/dist/connectors/codex/codex.connector.js.map +0 -1
  110. package/dist/connectors/gemini/gemini.connector.d.ts +0 -41
  111. package/dist/connectors/gemini/gemini.connector.d.ts.map +0 -1
  112. package/dist/connectors/gemini/gemini.connector.js +0 -61
  113. package/dist/connectors/gemini/gemini.connector.js.map +0 -1
  114. package/dist/connectors/qwen/qwen.connector.d.ts +0 -41
  115. package/dist/connectors/qwen/qwen.connector.d.ts.map +0 -1
  116. package/dist/connectors/qwen/qwen.connector.js +0 -61
  117. package/dist/connectors/qwen/qwen.connector.js.map +0 -1
  118. package/dist/types/base.types.d.ts.map +0 -1
  119. package/dist/types/base.types.js +0 -6
  120. package/dist/types/base.types.js.map +0 -1
@@ -1,41 +1,120 @@
1
1
  /**
2
- * Коннектор для Claude Code
2
+ * Коннектор для Claude Code CLI.
3
+ *
4
+ * Использует команды `claude mcp add/remove/list/get` вместо записи в файл.
5
+ *
6
+ * Discovery (на момент написания, Claude Code CLI 2.x):
7
+ * - `claude mcp list` НЕ поддерживает `--json` (только `-h/--help`).
8
+ * Вывод парсится как текст по строкам формата:
9
+ * `<server-name>: <command-summary> - <status-icon> <status-text>`
10
+ * где status-icon — один из `✓ Connected`, `✗ Failed to connect`,
11
+ * `! Needs authentication`. Имя сервера может содержать пробелы.
12
+ * - `claude mcp get <name>` даёт структурированный многострочный вывод:
13
+ * ```
14
+ * <name>:
15
+ * Scope: ...
16
+ * Status: ...
17
+ * Type: stdio
18
+ * Command: node
19
+ * Args: /abs/script.cjs [...]
20
+ * Environment:
21
+ * KEY1=value1
22
+ * KEY2=value2
23
+ * ```
24
+ * Каждая переменная окружения — отдельная строка с отступом.
25
+ * - `claude mcp add` НЕ поддерживает флаги `--cwd` или `--disabled`.
26
+ * При наличии в spec этих полей мы пишем предупреждение в Logger и
27
+ * игнорируем их (соответствующие поля недоступны в claude-code).
28
+ *
29
+ * Ограничения парсинга:
30
+ * - Args парсится по whitespace. Если путь в args содержит пробелы,
31
+ * парсер их некорректно разобьёт. Это ограничение `claude mcp get`,
32
+ * который выводит args одной сырой строкой без кавычек.
3
33
  */
4
34
  import { BaseConnector } from '../base/base-connector.js';
5
- import type { BaseMCPServerConfig, MCPClientInfo, ConnectionStatus } from '../../types.js';
35
+ import type { ConnectionStatus, MCPClientInfo } from '../../types/client.types.js';
36
+ import type { ServerLaunchSpec } from '../../types/launch.types.js';
6
37
  /**
7
- * Коннектор для Claude Code CLI
8
- * Использует команды `claude mcp add/remove/list` для управления серверами
9
- *
10
- * @template TConfig - Тип конфигурации MCP сервера
38
+ * Коннектор для Claude Code CLI.
11
39
  */
12
- export declare class ClaudeCodeConnector<TConfig extends BaseMCPServerConfig = BaseMCPServerConfig> extends BaseConnector<TConfig> {
40
+ export declare class ClaudeCodeConnector extends BaseConnector {
13
41
  private readonly serverName;
14
- private readonly entryPoint;
15
42
  /**
16
- * @param serverName - Имя MCP сервера для записи в конфигурацию
17
- * @param entryPoint - Относительный путь к точке входа сервера от projectPath
43
+ * @param serverName - Имя MCP сервера для управления через `claude mcp`
18
44
  */
19
- constructor(serverName: string, entryPoint: string);
45
+ constructor(serverName: string);
46
+ getClientInfo(): MCPClientInfo;
47
+ isInstalled(): Promise<boolean>;
20
48
  /**
21
- * Получить информацию о клиенте
49
+ * Получить статус подключения через парсинг `claude mcp list`.
50
+ *
51
+ * Состояния:
52
+ * - `✓ Connected` → connected: true
53
+ * - `✗ Failed to connect` → connected: false, error: 'Failed to connect'
54
+ * - `! Needs authentication` → connected: false, error: 'Needs authentication'
55
+ * - неизвестное → connected: false, error: `Unknown state: <raw>` (для диагностики)
56
+ * - сервер отсутствует в выводе → connected: false
57
+ * - таймаут → connected: false, error: 'Timeout: ...'
22
58
  */
23
- getClientInfo(): MCPClientInfo;
59
+ getStatus(): Promise<ConnectionStatus>;
24
60
  /**
25
- * Проверить, установлен ли клиент
61
+ * Подключить MCP сервер через `claude mcp add`.
62
+ *
63
+ * Формирует команду вида:
64
+ * claude mcp add --transport stdio <name> [--env K=V ...] -- <command> [<args>...]
65
+ *
66
+ * Поля {@link ServerLaunchSpec.cwd} и {@link ServerLaunchSpec.disabled}
67
+ * НЕ поддерживаются claude-code CLI — при их наличии пишется warning и они
68
+ * игнорируются.
26
69
  */
27
- isInstalled(): Promise<boolean>;
70
+ connect(spec: ServerLaunchSpec): Promise<void>;
71
+ disconnect(): Promise<void>;
28
72
  /**
29
- * Получить статус подключения
73
+ * Получить spec через `claude mcp get <name>`.
74
+ *
75
+ * Парсит структурированный вывод (multi-line):
76
+ * Type: stdio
77
+ * Command: node
78
+ * Args: /abs/path.cjs
79
+ * Environment:
80
+ * KEY=value
81
+ * OTHER=...
82
+ *
83
+ * @returns spec, если сервер есть и stdio; `null` если не найден, http/sse или
84
+ * парсинг не удался.
30
85
  */
31
- getStatus(): Promise<ConnectionStatus>;
86
+ getLaunchSpec(): Promise<ServerLaunchSpec | null>;
32
87
  /**
33
- * Подключить MCP сервер
88
+ * Парсинг строк `claude mcp list`. Формат строки:
89
+ * `<name>: <command-tail> - <status>`
90
+ * где `<name>` может содержать пробелы (например, `claude.ai Gmail`).
91
+ *
92
+ * Чтобы корректно распознать строку именно нашего сервера, проверяем префикс
93
+ * `<serverName>: ` (с обязательным пробелом после двоеточия — иначе
94
+ * `tracker: ...` поймает `tracker-dev: ...`).
34
95
  */
35
- connect(serverConfig: TConfig): Promise<void>;
96
+ private parseStatusFromList;
36
97
  /**
37
- * Отключить MCP сервер
98
+ * Парсинг вывода `claude mcp get <name>`. Возвращает `null`, если сервер не
99
+ * stdio или критичные поля не распознаны.
100
+ *
101
+ * Особенности формата:
102
+ * - `Environment:` сам по себе обычно без значения, далее следуют строки
103
+ * с отступом вида ` KEY=value` (по одной паре на строку).
104
+ * - `Args:` — одна строка, разделители — пробелы. Пути с пробелами в
105
+ * результате парсятся некорректно (ограничение `claude mcp get`).
38
106
  */
39
- disconnect(): Promise<void>;
107
+ private parseLaunchSpecFromGet;
108
+ /**
109
+ * Парсинг секции `Environment:` из вывода `claude mcp get`.
110
+ *
111
+ * Поддерживает 2 формата:
112
+ * 1. Многострочный (CLI 2.x): `Environment:` + последующие строки с отступом
113
+ * вида ` KEY=value` (одна пара на строку, продолжается пока есть отступ).
114
+ * 2. Однострочный (legacy/fallback): `Environment: KEY=v1, OTHER=v2`.
115
+ * Разделители — `,` между парами; разделитель ключ/значение — `=`.
116
+ * Этот формат не выдерживает запятых в values; ограничение задокументировано.
117
+ */
118
+ private parseEnvSection;
40
119
  }
41
120
  //# sourceMappingURL=claude-code.connector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.connector.d.ts","sourceRoot":"","sources":["../../../src/connectors/claude-code/claude-code.connector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAU3F;;;;;GAKG;AACH,qBAAa,mBAAmB,CAC9B,OAAO,SAAS,mBAAmB,GAAG,mBAAmB,CACzD,SAAQ,aAAa,CAAC,OAAO,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC;;;OAGG;gBACS,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAMlD;;OAEG;IACH,aAAa,IAAI,aAAa;IAW9B;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAuBtC;;OAEG;IACG,OAAO,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
1
+ {"version":3,"file":"claude-code.connector.d.ts","sourceRoot":"","sources":["../../../src/connectors/claude-code/claude-code.connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAkBpE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC;;OAEG;gBACS,UAAU,EAAE,MAAM;IAK9B,aAAa,IAAI,aAAa;IAW9B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B;;;;;;;;;;OAUG;IACH,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAgBtC;;;;;;;;;OASG;IACG,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;;;;;;;;;;OAaG;IACH,aAAa,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAejD;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;;;;;;;;OASG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CAsCxB"}
@@ -1,9 +1,39 @@
1
1
  /**
2
- * Коннектор для Claude Code
2
+ * Коннектор для Claude Code CLI.
3
+ *
4
+ * Использует команды `claude mcp add/remove/list/get` вместо записи в файл.
5
+ *
6
+ * Discovery (на момент написания, Claude Code CLI 2.x):
7
+ * - `claude mcp list` НЕ поддерживает `--json` (только `-h/--help`).
8
+ * Вывод парсится как текст по строкам формата:
9
+ * `<server-name>: <command-summary> - <status-icon> <status-text>`
10
+ * где status-icon — один из `✓ Connected`, `✗ Failed to connect`,
11
+ * `! Needs authentication`. Имя сервера может содержать пробелы.
12
+ * - `claude mcp get <name>` даёт структурированный многострочный вывод:
13
+ * ```
14
+ * <name>:
15
+ * Scope: ...
16
+ * Status: ...
17
+ * Type: stdio
18
+ * Command: node
19
+ * Args: /abs/script.cjs [...]
20
+ * Environment:
21
+ * KEY1=value1
22
+ * KEY2=value2
23
+ * ```
24
+ * Каждая переменная окружения — отдельная строка с отступом.
25
+ * - `claude mcp add` НЕ поддерживает флаги `--cwd` или `--disabled`.
26
+ * При наличии в spec этих полей мы пишем предупреждение в Logger и
27
+ * игнорируем их (соответствующие поля недоступны в claude-code).
28
+ *
29
+ * Ограничения парсинга:
30
+ * - Args парсится по whitespace. Если путь в args содержит пробелы,
31
+ * парсер их некорректно разобьёт. Это ограничение `claude mcp get`,
32
+ * который выводит args одной сырой строкой без кавычек.
3
33
  */
4
- import * as path from 'node:path';
5
34
  import { BaseConnector } from '../base/base-connector.js';
6
35
  import { CommandExecutor } from '../../utils/command-executor.js';
36
+ import { Logger } from '../../utils/logger.js';
7
37
  /**
8
38
  * Type guard для проверки Error
9
39
  */
@@ -11,26 +41,25 @@ function isError(error) {
11
41
  return error instanceof Error;
12
42
  }
13
43
  /**
14
- * Коннектор для Claude Code CLI
15
- * Использует команды `claude mcp add/remove/list` для управления серверами
44
+ * Таймаут для `claude mcp list` (мс).
16
45
  *
17
- * @template TConfig - Тип конфигурации MCP сервера
46
+ * `list` запускает stdio-серверы для health-check и при проблемах с
47
+ * authentication-токеном/демоном клиента может зависнуть. Без таймаута CLI
48
+ * застывает намертво.
49
+ */
50
+ const CLAUDE_MCP_LIST_TIMEOUT_MS = 5000;
51
+ /**
52
+ * Коннектор для Claude Code CLI.
18
53
  */
19
54
  export class ClaudeCodeConnector extends BaseConnector {
20
55
  serverName;
21
- entryPoint;
22
56
  /**
23
- * @param serverName - Имя MCP сервера для записи в конфигурацию
24
- * @param entryPoint - Относительный путь к точке входа сервера от projectPath
57
+ * @param serverName - Имя MCP сервера для управления через `claude mcp`
25
58
  */
26
- constructor(serverName, entryPoint) {
59
+ constructor(serverName) {
27
60
  super();
28
61
  this.serverName = serverName;
29
- this.entryPoint = entryPoint;
30
62
  }
31
- /**
32
- * Получить информацию о клиенте
33
- */
34
63
  getClientInfo() {
35
64
  return {
36
65
  name: 'claude-code',
@@ -41,28 +70,26 @@ export class ClaudeCodeConnector extends BaseConnector {
41
70
  platforms: ['darwin', 'linux', 'win32'],
42
71
  };
43
72
  }
44
- /**
45
- * Проверить, установлен ли клиент
46
- */
47
73
  isInstalled() {
48
74
  return Promise.resolve(CommandExecutor.isCommandAvailable('claude'));
49
75
  }
50
76
  /**
51
- * Получить статус подключения
77
+ * Получить статус подключения через парсинг `claude mcp list`.
78
+ *
79
+ * Состояния:
80
+ * - `✓ Connected` → connected: true
81
+ * - `✗ Failed to connect` → connected: false, error: 'Failed to connect'
82
+ * - `! Needs authentication` → connected: false, error: 'Needs authentication'
83
+ * - неизвестное → connected: false, error: `Unknown state: <raw>` (для диагностики)
84
+ * - сервер отсутствует в выводе → connected: false
85
+ * - таймаут → connected: false, error: 'Timeout: ...'
52
86
  */
53
87
  getStatus() {
88
+ let output;
54
89
  try {
55
- const output = CommandExecutor.exec('claude mcp list');
56
- const connected = output.includes(this.serverName);
57
- if (connected) {
58
- return Promise.resolve({
59
- connected,
60
- details: {
61
- configPath: 'managed by claude mcp',
62
- },
63
- });
64
- }
65
- return Promise.resolve({ connected });
90
+ output = CommandExecutor.execFile('claude', ['mcp', 'list'], {
91
+ timeout: CLAUDE_MCP_LIST_TIMEOUT_MS,
92
+ });
66
93
  }
67
94
  catch (error) {
68
95
  return Promise.resolve({
@@ -70,27 +97,181 @@ export class ClaudeCodeConnector extends BaseConnector {
70
97
  error: `Ошибка проверки статуса: ${isError(error) ? error.message : String(error)}`,
71
98
  });
72
99
  }
100
+ return Promise.resolve(this.parseStatusFromList(output));
73
101
  }
74
102
  /**
75
- * Подключить MCP сервер
103
+ * Подключить MCP сервер через `claude mcp add`.
104
+ *
105
+ * Формирует команду вида:
106
+ * claude mcp add --transport stdio <name> [--env K=V ...] -- <command> [<args>...]
107
+ *
108
+ * Поля {@link ServerLaunchSpec.cwd} и {@link ServerLaunchSpec.disabled}
109
+ * НЕ поддерживаются claude-code CLI — при их наличии пишется warning и они
110
+ * игнорируются.
76
111
  */
77
- async connect(serverConfig) {
112
+ async connect(spec) {
113
+ if (spec.cwd !== undefined) {
114
+ Logger.warn(`claude-code не поддерживает 'cwd' в конфигурации MCP сервера; поле проигнорировано (значение: ${spec.cwd}).`);
115
+ }
116
+ if (spec.disabled === true) {
117
+ Logger.warn("claude-code не поддерживает 'disabled' для MCP сервера; будет добавлен как активный.");
118
+ }
78
119
  const args = ['mcp', 'add', '--transport', 'stdio', this.serverName];
79
- // Добавить переменные окружения из config.env
80
- if (serverConfig.env) {
81
- for (const [key, value] of Object.entries(serverConfig.env)) {
82
- args.push('--env', `${key}=${value}`);
83
- }
120
+ for (const [key, value] of Object.entries(spec.env)) {
121
+ args.push('--env', `${key}=${value}`);
84
122
  }
85
- // Добавить команду и аргументы
86
- args.push('--', 'node', path.join(serverConfig.projectPath, this.entryPoint));
123
+ args.push('--', spec.command, ...spec.args);
87
124
  await CommandExecutor.execInteractive('claude', args);
88
125
  }
89
- /**
90
- * Отключить MCP сервер
91
- */
92
126
  async disconnect() {
93
127
  await CommandExecutor.execInteractive('claude', ['mcp', 'remove', this.serverName]);
94
128
  }
129
+ /**
130
+ * Получить spec через `claude mcp get <name>`.
131
+ *
132
+ * Парсит структурированный вывод (multi-line):
133
+ * Type: stdio
134
+ * Command: node
135
+ * Args: /abs/path.cjs
136
+ * Environment:
137
+ * KEY=value
138
+ * OTHER=...
139
+ *
140
+ * @returns spec, если сервер есть и stdio; `null` если не найден, http/sse или
141
+ * парсинг не удался.
142
+ */
143
+ getLaunchSpec() {
144
+ let output;
145
+ try {
146
+ output = CommandExecutor.execFile('claude', ['mcp', 'get', this.serverName], {
147
+ timeout: CLAUDE_MCP_LIST_TIMEOUT_MS,
148
+ });
149
+ }
150
+ catch {
151
+ return Promise.resolve(null);
152
+ }
153
+ return Promise.resolve(this.parseLaunchSpecFromGet(output));
154
+ }
155
+ // ----- internal -----
156
+ /**
157
+ * Парсинг строк `claude mcp list`. Формат строки:
158
+ * `<name>: <command-tail> - <status>`
159
+ * где `<name>` может содержать пробелы (например, `claude.ai Gmail`).
160
+ *
161
+ * Чтобы корректно распознать строку именно нашего сервера, проверяем префикс
162
+ * `<serverName>: ` (с обязательным пробелом после двоеточия — иначе
163
+ * `tracker: ...` поймает `tracker-dev: ...`).
164
+ */
165
+ parseStatusFromList(output) {
166
+ const prefix = `${this.serverName}: `;
167
+ const line = output
168
+ .split('\n')
169
+ .map((l) => l.trim())
170
+ .find((l) => l.startsWith(prefix));
171
+ if (!line) {
172
+ return { connected: false };
173
+ }
174
+ const tail = line.slice(prefix.length).trim();
175
+ // последний разделитель ' - ' отделяет статус
176
+ const sepIdx = tail.lastIndexOf(' - ');
177
+ const statusPart = sepIdx >= 0 ? tail.slice(sepIdx + 3).trim() : tail;
178
+ if (statusPart.startsWith('✓')) {
179
+ return {
180
+ connected: true,
181
+ details: { configPath: 'managed by claude mcp' },
182
+ };
183
+ }
184
+ if (statusPart.startsWith('✗')) {
185
+ // распространённый вариант: `✗ Failed to connect`
186
+ return { connected: false, error: statusPart.replace(/^✗\s*/, '') };
187
+ }
188
+ if (statusPart.startsWith('!')) {
189
+ return { connected: false, error: statusPart.replace(/^!\s*/, '') };
190
+ }
191
+ // Неизвестное состояние: считаем НЕ подключённым (consume-defensive),
192
+ // чтобы при изменении формата claude CLI не давать false positive.
193
+ return {
194
+ connected: false,
195
+ error: `Unknown state: ${statusPart}`,
196
+ details: { configPath: 'managed by claude mcp' },
197
+ };
198
+ }
199
+ /**
200
+ * Парсинг вывода `claude mcp get <name>`. Возвращает `null`, если сервер не
201
+ * stdio или критичные поля не распознаны.
202
+ *
203
+ * Особенности формата:
204
+ * - `Environment:` сам по себе обычно без значения, далее следуют строки
205
+ * с отступом вида ` KEY=value` (по одной паре на строку).
206
+ * - `Args:` — одна строка, разделители — пробелы. Пути с пробелами в
207
+ * результате парсятся некорректно (ограничение `claude mcp get`).
208
+ */
209
+ parseLaunchSpecFromGet(output) {
210
+ const rawLines = output.split('\n');
211
+ const trimmedLines = rawLines.map((l) => l.trim());
212
+ const findValue = (label) => {
213
+ const prefix = `${label}:`;
214
+ const line = trimmedLines.find((l) => l.startsWith(prefix));
215
+ return line ? line.slice(prefix.length).trim() : undefined;
216
+ };
217
+ const type = findValue('Type');
218
+ if (type && type.toLowerCase() !== 'stdio') {
219
+ return null;
220
+ }
221
+ const command = findValue('Command');
222
+ if (!command) {
223
+ return null;
224
+ }
225
+ const argsLine = findValue('Args') ?? '';
226
+ const args = argsLine.length > 0 ? argsLine.split(/\s+/).filter((a) => a.length > 0) : [];
227
+ const env = this.parseEnvSection(rawLines);
228
+ return { command, args, env };
229
+ }
230
+ /**
231
+ * Парсинг секции `Environment:` из вывода `claude mcp get`.
232
+ *
233
+ * Поддерживает 2 формата:
234
+ * 1. Многострочный (CLI 2.x): `Environment:` + последующие строки с отступом
235
+ * вида ` KEY=value` (одна пара на строку, продолжается пока есть отступ).
236
+ * 2. Однострочный (legacy/fallback): `Environment: KEY=v1, OTHER=v2`.
237
+ * Разделители — `,` между парами; разделитель ключ/значение — `=`.
238
+ * Этот формат не выдерживает запятых в values; ограничение задокументировано.
239
+ */
240
+ parseEnvSection(rawLines) {
241
+ const env = {};
242
+ // Найти индекс строки `Environment:`
243
+ const envHeaderIdx = rawLines.findIndex((l) => l.trim().startsWith('Environment:'));
244
+ if (envHeaderIdx === -1)
245
+ return env;
246
+ const envHeaderLine = rawLines[envHeaderIdx] ?? '';
247
+ const inline = envHeaderLine.slice(envHeaderLine.indexOf(':') + 1).trim();
248
+ if (inline.length > 0) {
249
+ // Однострочный формат (legacy): "Environment: K1=v1, K2=v2"
250
+ for (const pair of inline.split(',').map((s) => s.trim())) {
251
+ const eqIdx = pair.indexOf('=');
252
+ if (eqIdx > 0) {
253
+ env[pair.slice(0, eqIdx)] = pair.slice(eqIdx + 1);
254
+ }
255
+ }
256
+ return env;
257
+ }
258
+ // Многострочный формат: KEY=VALUE на каждой следующей строке с отступом.
259
+ // Останавливаемся при первой строке без отступа (пустая или новая секция).
260
+ for (let i = envHeaderIdx + 1; i < rawLines.length; i++) {
261
+ const raw = rawLines[i] ?? '';
262
+ const trimmed = raw.trim();
263
+ if (trimmed.length === 0)
264
+ break;
265
+ // Если строка без отступа — это новая секция (например, "To remove this server...")
266
+ const hasIndent = raw.startsWith(' ') || raw.startsWith('\t');
267
+ if (!hasIndent)
268
+ break;
269
+ const eqIdx = trimmed.indexOf('=');
270
+ if (eqIdx > 0) {
271
+ env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);
272
+ }
273
+ }
274
+ return env;
275
+ }
95
276
  }
96
277
  //# sourceMappingURL=claude-code.connector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.connector.js","sourceRoot":"","sources":["../../../src/connectors/claude-code/claude-code.connector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-code.connector.js","sourceRoot":"","sources":["../../../src/connectors/claude-code/claude-code.connector.ts"],"names":[],"mappings":"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"}
@@ -1,42 +1,42 @@
1
1
  /**
2
- * Фабрика коннекторов для известных MCP клиентов
2
+ * Фабрика коннекторов для известных MCP клиентов.
3
3
  *
4
4
  * Централизует конфигурацию клиентов и устраняет дублирование кода.
5
5
  */
6
6
  import { ConfigurableConnector, type ConnectorClientConfig } from './base/configurable-connector.js';
7
- import type { BaseMCPServerConfig } from '../types.js';
8
7
  /**
9
- * Известные MCP клиенты
8
+ * Известные MCP клиенты (файл-ориентированные).
9
+ *
10
+ * `claude-code` — отдельный {@link ClaudeCodeConnector}, потому что управляется
11
+ * не файлом, а командами `claude mcp add/remove/list`.
10
12
  */
11
- export type KnownClient = 'gemini' | 'qwen' | 'codex';
13
+ export type KnownClient = 'claude-desktop' | 'gemini' | 'qwen' | 'codex';
12
14
  /**
13
- * Создать коннектор для известного клиента
15
+ * Создать коннектор для известного клиента.
14
16
  *
15
17
  * @param client - Имя известного клиента
16
- * @param serverName - Имя MCP сервера
17
- * @param entryPoint - Относительный путь к точке входа сервера
18
+ * @param serverName - Имя MCP сервера для записи в конфиг
18
19
  *
19
20
  * @example
20
21
  * ```typescript
21
- * const geminiConnector = createConnector('gemini', 'mcp-server-yandex-tracker', 'dist/yandex-tracker.bundle.cjs');
22
- * const qwenConnector = createConnector('qwen', 'mcp-server-yandex-tracker', 'dist/yandex-tracker.bundle.cjs');
22
+ * const gemini = createConnector('gemini', 'mcp-server-yandex-tracker');
23
+ * const desktop = createConnector('claude-desktop', 'mcp-server-yandex-tracker');
23
24
  * ```
24
25
  */
25
- export declare function createConnector<TConfig extends BaseMCPServerConfig = BaseMCPServerConfig>(client: KnownClient, serverName: string, entryPoint: string): ConfigurableConnector<TConfig>;
26
+ export declare function createConnector(client: KnownClient, serverName: string): ConfigurableConnector;
26
27
  /**
27
- * Создать коннектор с кастомной конфигурацией
28
+ * Создать коннектор с произвольной конфигурацией клиента.
28
29
  *
29
30
  * @param serverName - Имя MCP сервера
30
- * @param entryPoint - Относительный путь к точке входа сервера
31
31
  * @param clientConfig - Конфигурация клиента
32
32
  */
33
- export declare function createCustomConnector<TConfig extends BaseMCPServerConfig = BaseMCPServerConfig>(serverName: string, entryPoint: string, clientConfig: ConnectorClientConfig): ConfigurableConnector<TConfig>;
33
+ export declare function createCustomConnector(serverName: string, clientConfig: ConnectorClientConfig): ConfigurableConnector;
34
34
  /**
35
- * Получить конфигурацию известного клиента
35
+ * Получить конфигурацию известного клиента (копию).
36
36
  */
37
37
  export declare function getClientConfig(client: KnownClient): ConnectorClientConfig;
38
38
  /**
39
- * Получить список всех известных клиентов
39
+ * Получить список всех известных клиентов.
40
40
  */
41
41
  export declare function getKnownClients(): KnownClient[];
42
42
  //# sourceMappingURL=connector-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connector-factory.d.ts","sourceRoot":"","sources":["../../src/connectors/connector-factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,qBAAqB,EACrB,KAAK,qBAAqB,EAC3B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAoCtD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,OAAO,SAAS,mBAAmB,GAAG,mBAAmB,EACvF,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,qBAAqB,CAAC,OAAO,CAAC,CAGhC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,SAAS,mBAAmB,GAAG,mBAAmB,EAC7F,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,qBAAqB,GAClC,qBAAqB,CAAC,OAAO,CAAC,CAEhC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,qBAAqB,CAE1E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C"}
1
+ {"version":3,"file":"connector-factory.d.ts","sourceRoot":"","sources":["../../src/connectors/connector-factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,qBAAqB,EACrB,KAAK,qBAAqB,EAC3B,MAAM,kCAAkC,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAsFzE;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAE9F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,qBAAqB,GAClC,qBAAqB,CAEvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,qBAAqB,CAE1E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C"}