@fractalizer/mcp-cli 0.3.18 → 1.0.1

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 +18 -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 +171 -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 +368 -43
  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} +37 -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,191 @@
1
1
  /**
2
- * Коннектор для Claude Code
2
+ * Коннектор для Claude Code CLI.
3
+ *
4
+ * Использует команды `claude mcp add/remove/list/get` вместо записи в файл.
5
+ *
6
+ * Управление scope (`local` / `user` / `project`):
7
+ * - claude mcp использует разные хранилища для разных scope: local —
8
+ * `~/.claude.json` → `projects["<cwd>"].mcpServers` (приватно к проекту),
9
+ * user — корень `~/.claude.json` (доступен везде), project — `.mcp.json`
10
+ * в корне проекта (видим команде через git).
11
+ * - `claude mcp add` без `--scope` дефолтит в `local` и НЕ блокирует, если
12
+ * запись уже есть в другом scope (молча создаёт дубликат).
13
+ * - `claude mcp remove` без `--scope` сам ищет запись, но падает с
14
+ * "exists in multiple scopes", если запись в нескольких.
15
+ *
16
+ * Поведение этого коннектора (фикс баг-а с дубликатами):
17
+ * - connect → принудительно `--scope user` (стабильный default; доступен
18
+ * из любой директории). Если запись уже существует (в любом scope) —
19
+ * `connect` бросает осмысленную ошибку с подсказкой про `disconnect`.
20
+ * - disconnect → итеративно `claude mcp get` + `claude mcp remove -s <scope>`
21
+ * пока запись существует (умеет вычищать дубликаты, появившиеся ранее).
22
+ * - getStatus → читает scope из `claude mcp get` и кладёт его в `details.scope`.
23
+ *
24
+ * Discovery (на момент написания, Claude Code CLI 2.x):
25
+ * - `claude mcp list` НЕ поддерживает `--json` (только `-h/--help`).
26
+ * Вывод парсится как текст по строкам формата:
27
+ * `<server-name>: <command-summary> - <status-icon> <status-text>`
28
+ * где status-icon — один из `✓ Connected`, `✗ Failed to connect`,
29
+ * `! Needs authentication`. Имя сервера может содержать пробелы.
30
+ * - `claude mcp get <name>` даёт структурированный многострочный вывод:
31
+ * ```
32
+ * <name>:
33
+ * Scope: Local config (private to you in this project)
34
+ * Status: ...
35
+ * Type: stdio
36
+ * Command: node
37
+ * Args: /abs/script.cjs [...]
38
+ * Environment:
39
+ * KEY1=value1
40
+ * KEY2=value2
41
+ * ```
42
+ * Каждая переменная окружения — отдельная строка с отступом.
43
+ * - `claude mcp add` НЕ поддерживает флаги `--cwd` или `--disabled`.
44
+ * При наличии в spec этих полей мы пишем предупреждение в Logger и
45
+ * игнорируем их (соответствующие поля недоступны в claude-code).
46
+ *
47
+ * Ограничения парсинга:
48
+ * - Args парсится по whitespace. Если путь в args содержит пробелы,
49
+ * парсер их некорректно разобьёт. Это ограничение `claude mcp get`,
50
+ * который выводит args одной сырой строкой без кавычек.
3
51
  */
4
52
  import { BaseConnector } from '../base/base-connector.js';
5
- import type { BaseMCPServerConfig, MCPClientInfo, ConnectionStatus } from '../../types.js';
53
+ import type { ConnectionStatus, MCPClientInfo } from '../../types/client.types.js';
54
+ import type { ServerLaunchSpec } from '../../types/launch.types.js';
6
55
  /**
7
- * Коннектор для Claude Code CLI
8
- * Использует команды `claude mcp add/remove/list` для управления серверами
9
- *
10
- * @template TConfig - Тип конфигурации MCP сервера
56
+ * Возможные scope записи в `claude mcp`.
11
57
  */
12
- export declare class ClaudeCodeConnector<TConfig extends BaseMCPServerConfig = BaseMCPServerConfig> extends BaseConnector<TConfig> {
58
+ export type ClaudeCodeScope = 'user' | 'project' | 'local';
59
+ /**
60
+ * Коннектор для Claude Code CLI.
61
+ */
62
+ export declare class ClaudeCodeConnector extends BaseConnector {
13
63
  private readonly serverName;
14
- private readonly entryPoint;
15
- /**
16
- * @param serverName - Имя MCP сервера для записи в конфигурацию
17
- * @param entryPoint - Относительный путь к точке входа сервера от projectPath
18
- */
19
- constructor(serverName: string, entryPoint: string);
20
64
  /**
21
- * Получить информацию о клиенте
65
+ * @param serverName - Имя MCP сервера для управления через `claude mcp`
22
66
  */
67
+ constructor(serverName: string);
23
68
  getClientInfo(): MCPClientInfo;
24
- /**
25
- * Проверить, установлен ли клиент
26
- */
27
69
  isInstalled(): Promise<boolean>;
28
70
  /**
29
- * Получить статус подключения
71
+ * Получить статус подключения через парсинг `claude mcp list` + обогащение
72
+ * scope из `claude mcp get`.
73
+ *
74
+ * Состояния:
75
+ * - `✓ Connected` → connected: true
76
+ * - `✗ Failed to connect` → connected: false, error: 'Failed to connect'
77
+ * - `! Needs authentication` → connected: false, error: 'Needs authentication'
78
+ * - неизвестное → connected: false, error: `Unknown state: <raw>` (для диагностики)
79
+ * - сервер отсутствует в выводе → connected: false
80
+ * - таймаут → connected: false, error: 'Timeout: ...'
30
81
  */
31
82
  getStatus(): Promise<ConnectionStatus>;
32
83
  /**
33
- * Подключить MCP сервер
84
+ * Подключить MCP сервер через `claude mcp add --scope user`.
85
+ *
86
+ * Формирует команду вида:
87
+ * claude mcp add --scope user --transport stdio <name> [--env K=V ...] -- <command> [<args>...]
88
+ *
89
+ * Использование `--scope user` (вместо CLI default `local`) обеспечивает
90
+ * доступность сервера из любой директории и единое стабильное место хранения.
91
+ * Это сознательное отклонение от дефолта `claude mcp`.
92
+ *
93
+ * Перед `add` проверяет существование записи в любом scope через
94
+ * {@link getCurrentScope}. Если запись уже есть — бросает Error с подсказкой
95
+ * пользователю запустить `disconnect`, чтобы избежать дубликатов между scope
96
+ * (`claude mcp add` без проверки молча создаёт дубли).
97
+ *
98
+ * Поля {@link ServerLaunchSpec.cwd} и {@link ServerLaunchSpec.disabled}
99
+ * НЕ поддерживаются claude-code CLI — при их наличии пишется warning и они
100
+ * игнорируются.
34
101
  */
35
- connect(serverConfig: TConfig): Promise<void>;
102
+ connect(spec: ServerLaunchSpec): Promise<void>;
36
103
  /**
37
- * Отключить MCP сервер
104
+ * Отключить MCP сервер.
105
+ *
106
+ * Алгоритм: цикл `get` → `remove --scope <scope>` пока запись существует.
107
+ * Это позволяет корректно вычистить случай, когда запись присутствует в
108
+ * нескольких scope (исторический баг ранних версий коннектора, где `add`
109
+ * мог создать дубликаты между local и user).
110
+ *
111
+ * Если запись не найдена ни в одном scope — бросает Error.
38
112
  */
39
113
  disconnect(): Promise<void>;
114
+ /**
115
+ * Получить spec через `claude mcp get <name>`.
116
+ *
117
+ * Парсит структурированный вывод (multi-line):
118
+ * Type: stdio
119
+ * Command: node
120
+ * Args: /abs/path.cjs
121
+ * Environment:
122
+ * KEY=value
123
+ * OTHER=...
124
+ *
125
+ * @returns spec, если сервер есть и stdio; `null` если не найден, http/sse или
126
+ * парсинг не удался.
127
+ */
128
+ getLaunchSpec(): Promise<ServerLaunchSpec | null>;
129
+ /**
130
+ * Выполнить `claude mcp get <name>` с таймаутом, проглотив ошибку.
131
+ *
132
+ * `claude mcp get` возвращает non-zero, когда сервер не существует ни в одном
133
+ * scope. В этом случае возвращаем `null` (а не пробрасываем) — вызывающий код
134
+ * различает «нет записи» (null) и «есть запись» (любая строка вывода).
135
+ */
136
+ private runGet;
137
+ /**
138
+ * Определить scope текущей записи через `claude mcp get`.
139
+ *
140
+ * Если запись существует в нескольких scope (исторический баг),
141
+ * `claude mcp get` показывает один — приоритетный (local > project > user).
142
+ * Этого достаточно для итеративного `disconnect`: одной итерации хватает,
143
+ * чтобы убрать запись из показанного scope, а следующая увидит следующий.
144
+ *
145
+ * @returns scope или `null`, если запись отсутствует / парсинг неудачен.
146
+ */
147
+ private getCurrentScope;
148
+ /**
149
+ * Извлечь scope из вывода `claude mcp get`.
150
+ *
151
+ * Формат строки: ` Scope: Local config (private to you in this project)`.
152
+ * Метки в выводе CLI 2.x:
153
+ * - `Local config ...` → `local`
154
+ * - `User config ...` → `user`
155
+ * - `Project config ...` → `project`
156
+ */
157
+ private parseScopeFromGet;
158
+ /**
159
+ * Парсинг строк `claude mcp list`. Формат строки:
160
+ * `<name>: <command-tail> - <status>`
161
+ * где `<name>` может содержать пробелы (например, `claude.ai Gmail`).
162
+ *
163
+ * Чтобы корректно распознать строку именно нашего сервера, проверяем префикс
164
+ * `<serverName>: ` (с обязательным пробелом после двоеточия — иначе
165
+ * `tracker: ...` поймает `tracker-dev: ...`).
166
+ */
167
+ private parseStatusFromList;
168
+ /**
169
+ * Парсинг вывода `claude mcp get <name>`. Возвращает `null`, если сервер не
170
+ * stdio или критичные поля не распознаны.
171
+ *
172
+ * Особенности формата:
173
+ * - `Environment:` сам по себе обычно без значения, далее следуют строки
174
+ * с отступом вида ` KEY=value` (по одной паре на строку).
175
+ * - `Args:` — одна строка, разделители — пробелы. Пути с пробелами в
176
+ * результате парсятся некорректно (ограничение `claude mcp get`).
177
+ */
178
+ private parseLaunchSpecFromGet;
179
+ /**
180
+ * Парсинг секции `Environment:` из вывода `claude mcp get`.
181
+ *
182
+ * Поддерживает 2 формата:
183
+ * 1. Многострочный (CLI 2.x): `Environment:` + последующие строки с отступом
184
+ * вида ` KEY=value` (одна пара на строку, продолжается пока есть отступ).
185
+ * 2. Однострочный (legacy/fallback): `Environment: KEY=v1, OTHER=v2`.
186
+ * Разделители — `,` между парами; разделитель ключ/значение — `=`.
187
+ * Этот формат не выдерживает запятых в values; ограничение задокументировано.
188
+ */
189
+ private parseEnvSection;
40
190
  }
41
191
  //# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;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;AASpE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAkB3D;;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;;;;;;;;;;;OAWG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA0B5C;;;;;;;;;;;;;;;;;;OAkBG;IACG,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCpD;;;;;;;;;OASG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BjC;;;;;;;;;;;;;OAaG;IACH,aAAa,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAQjD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;IAUd;;;;;;;;;OASG;YACW,eAAe;IAM7B;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IA8C3B;;;;;;;;;OASG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CAsCxB"}