@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.
- package/README.md +158 -266
- package/dist/commands/connect.command.d.ts +18 -15
- package/dist/commands/connect.command.d.ts.map +1 -1
- package/dist/commands/connect.command.js +66 -40
- package/dist/commands/connect.command.js.map +1 -1
- package/dist/commands/disconnect.command.d.ts +5 -17
- package/dist/commands/disconnect.command.d.ts.map +1 -1
- package/dist/commands/disconnect.command.js +4 -15
- package/dist/commands/disconnect.command.js.map +1 -1
- package/dist/commands/doctor.command.d.ts +34 -0
- package/dist/commands/doctor.command.d.ts.map +1 -0
- package/dist/commands/doctor.command.js +321 -0
- package/dist/commands/doctor.command.js.map +1 -0
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/list.command.d.ts +4 -9
- package/dist/commands/list.command.d.ts.map +1 -1
- package/dist/commands/list.command.js +1 -5
- package/dist/commands/list.command.js.map +1 -1
- package/dist/commands/status.command.d.ts +6 -13
- package/dist/commands/status.command.d.ts.map +1 -1
- package/dist/commands/status.command.js +18 -12
- package/dist/commands/status.command.js.map +1 -1
- package/dist/commands/validate.command.d.ts +6 -11
- package/dist/commands/validate.command.d.ts.map +1 -1
- package/dist/commands/validate.command.js +15 -19
- package/dist/commands/validate.command.js.map +1 -1
- package/dist/connectors/base/base-connector.d.ts +31 -55
- package/dist/connectors/base/base-connector.d.ts.map +1 -1
- package/dist/connectors/base/base-connector.js +71 -57
- package/dist/connectors/base/base-connector.js.map +1 -1
- package/dist/connectors/base/configurable-connector.d.ts +89 -24
- package/dist/connectors/base/configurable-connector.d.ts.map +1 -1
- package/dist/connectors/base/configurable-connector.js +266 -23
- package/dist/connectors/base/configurable-connector.js.map +1 -1
- package/dist/connectors/base/connector.interface.d.ts +29 -20
- package/dist/connectors/base/connector.interface.d.ts.map +1 -1
- package/dist/connectors/base/index.d.ts +0 -1
- package/dist/connectors/base/index.d.ts.map +1 -1
- package/dist/connectors/base/index.js +0 -1
- package/dist/connectors/base/index.js.map +1 -1
- package/dist/connectors/claude-code/claude-code.connector.d.ts +171 -21
- package/dist/connectors/claude-code/claude-code.connector.d.ts.map +1 -1
- package/dist/connectors/claude-code/claude-code.connector.js +368 -43
- package/dist/connectors/claude-code/claude-code.connector.js.map +1 -1
- package/dist/connectors/connector-factory.d.ts +15 -15
- package/dist/connectors/connector-factory.d.ts.map +1 -1
- package/dist/connectors/connector-factory.js +61 -18
- package/dist/connectors/connector-factory.js.map +1 -1
- package/dist/connectors/index.d.ts +0 -4
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +2 -8
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/registry.d.ts +20 -27
- package/dist/connectors/registry.d.ts.map +1 -1
- package/dist/connectors/registry.js +34 -34
- package/dist/connectors/registry.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/{base.types.d.ts → client.types.d.ts} +37 -30
- package/dist/types/client.types.d.ts.map +1 -0
- package/dist/types/client.types.js +6 -0
- package/dist/types/client.types.js.map +1 -0
- package/dist/types/doctor.types.d.ts +91 -0
- package/dist/types/doctor.types.d.ts.map +1 -0
- package/dist/types/doctor.types.js +12 -0
- package/dist/types/doctor.types.js.map +1 -0
- package/dist/types/launch.types.d.ts +59 -0
- package/dist/types/launch.types.d.ts.map +1 -0
- package/dist/types/launch.types.js +6 -0
- package/dist/types/launch.types.js.map +1 -0
- package/dist/types.d.ts +23 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/command-executor.d.ts +39 -3
- package/dist/utils/command-executor.d.ts.map +1 -1
- package/dist/utils/command-executor.js +95 -8
- package/dist/utils/command-executor.js.map +1 -1
- package/dist/utils/config-manager.d.ts +25 -42
- package/dist/utils/config-manager.d.ts.map +1 -1
- package/dist/utils/config-manager.js +21 -49
- package/dist/utils/config-manager.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/interactive-prompter.d.ts +16 -64
- package/dist/utils/interactive-prompter.d.ts.map +1 -1
- package/dist/utils/interactive-prompter.js +12 -65
- package/dist/utils/interactive-prompter.js.map +1 -1
- package/dist/utils/launch-spec-helpers.d.ts +38 -0
- package/dist/utils/launch-spec-helpers.d.ts.map +1 -0
- package/dist/utils/launch-spec-helpers.js +131 -0
- package/dist/utils/launch-spec-helpers.js.map +1 -0
- package/package.json +2 -2
- package/dist/connectors/base/file-based-connector.d.ts +0 -97
- package/dist/connectors/base/file-based-connector.d.ts.map +0 -1
- package/dist/connectors/base/file-based-connector.js +0 -185
- package/dist/connectors/base/file-based-connector.js.map +0 -1
- package/dist/connectors/claude-desktop/claude-desktop.connector.d.ts +0 -38
- package/dist/connectors/claude-desktop/claude-desktop.connector.d.ts.map +0 -1
- package/dist/connectors/claude-desktop/claude-desktop.connector.js +0 -68
- package/dist/connectors/claude-desktop/claude-desktop.connector.js.map +0 -1
- package/dist/connectors/codex/codex.connector.d.ts +0 -51
- package/dist/connectors/codex/codex.connector.d.ts.map +0 -1
- package/dist/connectors/codex/codex.connector.js +0 -76
- package/dist/connectors/codex/codex.connector.js.map +0 -1
- package/dist/connectors/gemini/gemini.connector.d.ts +0 -41
- package/dist/connectors/gemini/gemini.connector.d.ts.map +0 -1
- package/dist/connectors/gemini/gemini.connector.js +0 -61
- package/dist/connectors/gemini/gemini.connector.js.map +0 -1
- package/dist/connectors/qwen/qwen.connector.d.ts +0 -41
- package/dist/connectors/qwen/qwen.connector.d.ts.map +0 -1
- package/dist/connectors/qwen/qwen.connector.js +0 -61
- package/dist/connectors/qwen/qwen.connector.js.map +0 -1
- package/dist/types/base.types.d.ts.map +0 -1
- package/dist/types/base.types.js +0 -6
- package/dist/types/base.types.js.map +0 -1
|
@@ -1,9 +1,57 @@
|
|
|
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
|
-
import * as path from 'node:path';
|
|
5
52
|
import { BaseConnector } from '../base/base-connector.js';
|
|
6
53
|
import { CommandExecutor } from '../../utils/command-executor.js';
|
|
54
|
+
import { Logger } from '../../utils/logger.js';
|
|
7
55
|
/**
|
|
8
56
|
* Type guard для проверки Error
|
|
9
57
|
*/
|
|
@@ -11,26 +59,31 @@ function isError(error) {
|
|
|
11
59
|
return error instanceof Error;
|
|
12
60
|
}
|
|
13
61
|
/**
|
|
14
|
-
*
|
|
15
|
-
* Использует команды `claude mcp add/remove/list` для управления серверами
|
|
62
|
+
* Таймаут для `claude mcp list` / `get` (мс).
|
|
16
63
|
*
|
|
17
|
-
*
|
|
64
|
+
* `list` запускает stdio-серверы для health-check и при проблемах с
|
|
65
|
+
* authentication-токеном/демоном клиента может зависнуть. Без таймаута CLI
|
|
66
|
+
* застывает намертво.
|
|
67
|
+
*/
|
|
68
|
+
const CLAUDE_MCP_LIST_TIMEOUT_MS = 5000;
|
|
69
|
+
/**
|
|
70
|
+
* Лимит итераций цикла «get → remove» в {@link ClaudeCodeConnector.disconnect}.
|
|
71
|
+
* scope всего три (`user`/`project`/`local`); 4-я итерация — defensive against
|
|
72
|
+
* бесконечного цикла при неожиданных ответах CLI.
|
|
73
|
+
*/
|
|
74
|
+
const MAX_DISCONNECT_ITERATIONS = 4;
|
|
75
|
+
/**
|
|
76
|
+
* Коннектор для Claude Code CLI.
|
|
18
77
|
*/
|
|
19
78
|
export class ClaudeCodeConnector extends BaseConnector {
|
|
20
79
|
serverName;
|
|
21
|
-
entryPoint;
|
|
22
80
|
/**
|
|
23
|
-
* @param serverName - Имя MCP сервера для
|
|
24
|
-
* @param entryPoint - Относительный путь к точке входа сервера от projectPath
|
|
81
|
+
* @param serverName - Имя MCP сервера для управления через `claude mcp`
|
|
25
82
|
*/
|
|
26
|
-
constructor(serverName
|
|
83
|
+
constructor(serverName) {
|
|
27
84
|
super();
|
|
28
85
|
this.serverName = serverName;
|
|
29
|
-
this.entryPoint = entryPoint;
|
|
30
86
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Получить информацию о клиенте
|
|
33
|
-
*/
|
|
34
87
|
getClientInfo() {
|
|
35
88
|
return {
|
|
36
89
|
name: 'claude-code',
|
|
@@ -41,56 +94,328 @@ export class ClaudeCodeConnector extends BaseConnector {
|
|
|
41
94
|
platforms: ['darwin', 'linux', 'win32'],
|
|
42
95
|
};
|
|
43
96
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Проверить, установлен ли клиент
|
|
46
|
-
*/
|
|
47
97
|
isInstalled() {
|
|
48
98
|
return Promise.resolve(CommandExecutor.isCommandAvailable('claude'));
|
|
49
99
|
}
|
|
50
100
|
/**
|
|
51
|
-
* Получить статус подключения
|
|
101
|
+
* Получить статус подключения через парсинг `claude mcp list` + обогащение
|
|
102
|
+
* scope из `claude mcp get`.
|
|
103
|
+
*
|
|
104
|
+
* Состояния:
|
|
105
|
+
* - `✓ Connected` → connected: true
|
|
106
|
+
* - `✗ Failed to connect` → connected: false, error: 'Failed to connect'
|
|
107
|
+
* - `! Needs authentication` → connected: false, error: 'Needs authentication'
|
|
108
|
+
* - неизвестное → connected: false, error: `Unknown state: <raw>` (для диагностики)
|
|
109
|
+
* - сервер отсутствует в выводе → connected: false
|
|
110
|
+
* - таймаут → connected: false, error: 'Timeout: ...'
|
|
52
111
|
*/
|
|
53
|
-
getStatus() {
|
|
112
|
+
async getStatus() {
|
|
113
|
+
let output;
|
|
54
114
|
try {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return Promise.resolve({
|
|
59
|
-
connected,
|
|
60
|
-
details: {
|
|
61
|
-
configPath: 'managed by claude mcp',
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return Promise.resolve({ connected });
|
|
115
|
+
output = CommandExecutor.execFile('claude', ['mcp', 'list'], {
|
|
116
|
+
timeout: CLAUDE_MCP_LIST_TIMEOUT_MS,
|
|
117
|
+
});
|
|
66
118
|
}
|
|
67
119
|
catch (error) {
|
|
68
|
-
return
|
|
120
|
+
return {
|
|
69
121
|
connected: false,
|
|
70
122
|
error: `Ошибка проверки статуса: ${isError(error) ? error.message : String(error)}`,
|
|
71
|
-
}
|
|
123
|
+
};
|
|
72
124
|
}
|
|
125
|
+
const status = this.parseStatusFromList(output);
|
|
126
|
+
// Дополняем scope, если запись присутствует. `get` дешёвый и не запускает
|
|
127
|
+
// health-check, поэтому делаем второй вызов только если в list-выводе
|
|
128
|
+
// действительно есть наша строка (status.details уже выставлен).
|
|
129
|
+
if (status.details) {
|
|
130
|
+
const scope = await this.getCurrentScope();
|
|
131
|
+
if (scope) {
|
|
132
|
+
status.details = { ...status.details, scope };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return status;
|
|
73
136
|
}
|
|
74
137
|
/**
|
|
75
|
-
* Подключить MCP сервер
|
|
138
|
+
* Подключить MCP сервер через `claude mcp add --scope user`.
|
|
139
|
+
*
|
|
140
|
+
* Формирует команду вида:
|
|
141
|
+
* claude mcp add --scope user --transport stdio <name> [--env K=V ...] -- <command> [<args>...]
|
|
142
|
+
*
|
|
143
|
+
* Использование `--scope user` (вместо CLI default `local`) обеспечивает
|
|
144
|
+
* доступность сервера из любой директории и единое стабильное место хранения.
|
|
145
|
+
* Это сознательное отклонение от дефолта `claude mcp`.
|
|
146
|
+
*
|
|
147
|
+
* Перед `add` проверяет существование записи в любом scope через
|
|
148
|
+
* {@link getCurrentScope}. Если запись уже есть — бросает Error с подсказкой
|
|
149
|
+
* пользователю запустить `disconnect`, чтобы избежать дубликатов между scope
|
|
150
|
+
* (`claude mcp add` без проверки молча создаёт дубли).
|
|
151
|
+
*
|
|
152
|
+
* Поля {@link ServerLaunchSpec.cwd} и {@link ServerLaunchSpec.disabled}
|
|
153
|
+
* НЕ поддерживаются claude-code CLI — при их наличии пишется warning и они
|
|
154
|
+
* игнорируются.
|
|
76
155
|
*/
|
|
77
|
-
async connect(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
156
|
+
async connect(spec) {
|
|
157
|
+
if (spec.cwd !== undefined) {
|
|
158
|
+
Logger.warn(`claude-code не поддерживает 'cwd' в конфигурации MCP сервера; поле проигнорировано (значение: ${spec.cwd}).`);
|
|
159
|
+
}
|
|
160
|
+
if (spec.disabled === true) {
|
|
161
|
+
Logger.warn("claude-code не поддерживает 'disabled' для MCP сервера; будет добавлен как активный.");
|
|
84
162
|
}
|
|
85
|
-
|
|
86
|
-
|
|
163
|
+
const existingScope = await this.getCurrentScope();
|
|
164
|
+
if (existingScope !== null) {
|
|
165
|
+
throw new Error(`Сервер "${this.serverName}" уже зарегистрирован в claude-code (scope: ${existingScope}). ` +
|
|
166
|
+
`Запустите disconnect или удалите вручную: claude mcp remove "${this.serverName}" -s ${existingScope}`);
|
|
167
|
+
}
|
|
168
|
+
const args = [
|
|
169
|
+
'mcp',
|
|
170
|
+
'add',
|
|
171
|
+
'--scope',
|
|
172
|
+
'user',
|
|
173
|
+
'--transport',
|
|
174
|
+
'stdio',
|
|
175
|
+
this.serverName,
|
|
176
|
+
];
|
|
177
|
+
for (const [key, value] of Object.entries(spec.env)) {
|
|
178
|
+
args.push('--env', `${key}=${value}`);
|
|
179
|
+
}
|
|
180
|
+
args.push('--', spec.command, ...spec.args);
|
|
87
181
|
await CommandExecutor.execInteractive('claude', args);
|
|
88
182
|
}
|
|
89
183
|
/**
|
|
90
|
-
* Отключить MCP
|
|
184
|
+
* Отключить MCP сервер.
|
|
185
|
+
*
|
|
186
|
+
* Алгоритм: цикл `get` → `remove --scope <scope>` пока запись существует.
|
|
187
|
+
* Это позволяет корректно вычистить случай, когда запись присутствует в
|
|
188
|
+
* нескольких scope (исторический баг ранних версий коннектора, где `add`
|
|
189
|
+
* мог создать дубликаты между local и user).
|
|
190
|
+
*
|
|
191
|
+
* Если запись не найдена ни в одном scope — бросает Error.
|
|
91
192
|
*/
|
|
92
193
|
async disconnect() {
|
|
93
|
-
|
|
194
|
+
let removedAny = false;
|
|
195
|
+
for (let iteration = 0; iteration < MAX_DISCONNECT_ITERATIONS; iteration++) {
|
|
196
|
+
const scope = await this.getCurrentScope();
|
|
197
|
+
if (scope === null) {
|
|
198
|
+
if (!removedAny) {
|
|
199
|
+
throw new Error(`Сервер "${this.serverName}" не зарегистрирован в claude-code (ни в одном scope).`);
|
|
200
|
+
}
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
await CommandExecutor.execInteractive('claude', [
|
|
204
|
+
'mcp',
|
|
205
|
+
'remove',
|
|
206
|
+
'--scope',
|
|
207
|
+
scope,
|
|
208
|
+
this.serverName,
|
|
209
|
+
]);
|
|
210
|
+
removedAny = true;
|
|
211
|
+
}
|
|
212
|
+
// Защитный выход — не должен срабатывать при нормальном поведении CLI.
|
|
213
|
+
throw new Error(`Не удалось полностью отключить "${this.serverName}" за ${String(MAX_DISCONNECT_ITERATIONS)} итераций.`);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Получить spec через `claude mcp get <name>`.
|
|
217
|
+
*
|
|
218
|
+
* Парсит структурированный вывод (multi-line):
|
|
219
|
+
* Type: stdio
|
|
220
|
+
* Command: node
|
|
221
|
+
* Args: /abs/path.cjs
|
|
222
|
+
* Environment:
|
|
223
|
+
* KEY=value
|
|
224
|
+
* OTHER=...
|
|
225
|
+
*
|
|
226
|
+
* @returns spec, если сервер есть и stdio; `null` если не найден, http/sse или
|
|
227
|
+
* парсинг не удался.
|
|
228
|
+
*/
|
|
229
|
+
getLaunchSpec() {
|
|
230
|
+
const output = this.runGet();
|
|
231
|
+
if (output === null)
|
|
232
|
+
return Promise.resolve(null);
|
|
233
|
+
return Promise.resolve(this.parseLaunchSpecFromGet(output));
|
|
234
|
+
}
|
|
235
|
+
// ----- internal -----
|
|
236
|
+
/**
|
|
237
|
+
* Выполнить `claude mcp get <name>` с таймаутом, проглотив ошибку.
|
|
238
|
+
*
|
|
239
|
+
* `claude mcp get` возвращает non-zero, когда сервер не существует ни в одном
|
|
240
|
+
* scope. В этом случае возвращаем `null` (а не пробрасываем) — вызывающий код
|
|
241
|
+
* различает «нет записи» (null) и «есть запись» (любая строка вывода).
|
|
242
|
+
*/
|
|
243
|
+
runGet() {
|
|
244
|
+
try {
|
|
245
|
+
return CommandExecutor.execFile('claude', ['mcp', 'get', this.serverName], {
|
|
246
|
+
timeout: CLAUDE_MCP_LIST_TIMEOUT_MS,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Определить scope текущей записи через `claude mcp get`.
|
|
255
|
+
*
|
|
256
|
+
* Если запись существует в нескольких scope (исторический баг),
|
|
257
|
+
* `claude mcp get` показывает один — приоритетный (local > project > user).
|
|
258
|
+
* Этого достаточно для итеративного `disconnect`: одной итерации хватает,
|
|
259
|
+
* чтобы убрать запись из показанного scope, а следующая увидит следующий.
|
|
260
|
+
*
|
|
261
|
+
* @returns scope или `null`, если запись отсутствует / парсинг неудачен.
|
|
262
|
+
*/
|
|
263
|
+
async getCurrentScope() {
|
|
264
|
+
const output = this.runGet();
|
|
265
|
+
if (output === null)
|
|
266
|
+
return null;
|
|
267
|
+
return Promise.resolve(this.parseScopeFromGet(output));
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Извлечь scope из вывода `claude mcp get`.
|
|
271
|
+
*
|
|
272
|
+
* Формат строки: ` Scope: Local config (private to you in this project)`.
|
|
273
|
+
* Метки в выводе CLI 2.x:
|
|
274
|
+
* - `Local config ...` → `local`
|
|
275
|
+
* - `User config ...` → `user`
|
|
276
|
+
* - `Project config ...` → `project`
|
|
277
|
+
*/
|
|
278
|
+
parseScopeFromGet(output) {
|
|
279
|
+
const lines = output.split('\n').map((l) => l.trim());
|
|
280
|
+
const scopeLine = lines.find((l) => l.startsWith('Scope:'));
|
|
281
|
+
if (!scopeLine)
|
|
282
|
+
return null;
|
|
283
|
+
const value = scopeLine.slice('Scope:'.length).trim().toLowerCase();
|
|
284
|
+
if (value.startsWith('local'))
|
|
285
|
+
return 'local';
|
|
286
|
+
if (value.startsWith('user'))
|
|
287
|
+
return 'user';
|
|
288
|
+
if (value.startsWith('project'))
|
|
289
|
+
return 'project';
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Парсинг строк `claude mcp list`. Формат строки:
|
|
294
|
+
* `<name>: <command-tail> - <status>`
|
|
295
|
+
* где `<name>` может содержать пробелы (например, `claude.ai Gmail`).
|
|
296
|
+
*
|
|
297
|
+
* Чтобы корректно распознать строку именно нашего сервера, проверяем префикс
|
|
298
|
+
* `<serverName>: ` (с обязательным пробелом после двоеточия — иначе
|
|
299
|
+
* `tracker: ...` поймает `tracker-dev: ...`).
|
|
300
|
+
*/
|
|
301
|
+
parseStatusFromList(output) {
|
|
302
|
+
const prefix = `${this.serverName}: `;
|
|
303
|
+
const line = output
|
|
304
|
+
.split('\n')
|
|
305
|
+
.map((l) => l.trim())
|
|
306
|
+
.find((l) => l.startsWith(prefix));
|
|
307
|
+
if (!line) {
|
|
308
|
+
return { connected: false };
|
|
309
|
+
}
|
|
310
|
+
const tail = line.slice(prefix.length).trim();
|
|
311
|
+
// последний разделитель ' - ' отделяет статус
|
|
312
|
+
const sepIdx = tail.lastIndexOf(' - ');
|
|
313
|
+
const statusPart = sepIdx >= 0 ? tail.slice(sepIdx + 3).trim() : tail;
|
|
314
|
+
if (statusPart.startsWith('✓')) {
|
|
315
|
+
return {
|
|
316
|
+
connected: true,
|
|
317
|
+
details: { configPath: 'managed by claude mcp' },
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
if (statusPart.startsWith('✗')) {
|
|
321
|
+
// распространённый вариант: `✗ Failed to connect`
|
|
322
|
+
return {
|
|
323
|
+
connected: false,
|
|
324
|
+
error: statusPart.replace(/^✗\s*/, ''),
|
|
325
|
+
details: { configPath: 'managed by claude mcp' },
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
if (statusPart.startsWith('!')) {
|
|
329
|
+
return {
|
|
330
|
+
connected: false,
|
|
331
|
+
error: statusPart.replace(/^!\s*/, ''),
|
|
332
|
+
details: { configPath: 'managed by claude mcp' },
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
// Неизвестное состояние: считаем НЕ подключённым (consume-defensive),
|
|
336
|
+
// чтобы при изменении формата claude CLI не давать false positive.
|
|
337
|
+
return {
|
|
338
|
+
connected: false,
|
|
339
|
+
error: `Unknown state: ${statusPart}`,
|
|
340
|
+
details: { configPath: 'managed by claude mcp' },
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Парсинг вывода `claude mcp get <name>`. Возвращает `null`, если сервер не
|
|
345
|
+
* stdio или критичные поля не распознаны.
|
|
346
|
+
*
|
|
347
|
+
* Особенности формата:
|
|
348
|
+
* - `Environment:` сам по себе обычно без значения, далее следуют строки
|
|
349
|
+
* с отступом вида ` KEY=value` (по одной паре на строку).
|
|
350
|
+
* - `Args:` — одна строка, разделители — пробелы. Пути с пробелами в
|
|
351
|
+
* результате парсятся некорректно (ограничение `claude mcp get`).
|
|
352
|
+
*/
|
|
353
|
+
parseLaunchSpecFromGet(output) {
|
|
354
|
+
const rawLines = output.split('\n');
|
|
355
|
+
const trimmedLines = rawLines.map((l) => l.trim());
|
|
356
|
+
const findValue = (label) => {
|
|
357
|
+
const prefix = `${label}:`;
|
|
358
|
+
const line = trimmedLines.find((l) => l.startsWith(prefix));
|
|
359
|
+
return line ? line.slice(prefix.length).trim() : undefined;
|
|
360
|
+
};
|
|
361
|
+
const type = findValue('Type');
|
|
362
|
+
if (type && type.toLowerCase() !== 'stdio') {
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
const command = findValue('Command');
|
|
366
|
+
if (!command) {
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
369
|
+
const argsLine = findValue('Args') ?? '';
|
|
370
|
+
const args = argsLine.length > 0 ? argsLine.split(/\s+/).filter((a) => a.length > 0) : [];
|
|
371
|
+
const env = this.parseEnvSection(rawLines);
|
|
372
|
+
return { command, args, env };
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Парсинг секции `Environment:` из вывода `claude mcp get`.
|
|
376
|
+
*
|
|
377
|
+
* Поддерживает 2 формата:
|
|
378
|
+
* 1. Многострочный (CLI 2.x): `Environment:` + последующие строки с отступом
|
|
379
|
+
* вида ` KEY=value` (одна пара на строку, продолжается пока есть отступ).
|
|
380
|
+
* 2. Однострочный (legacy/fallback): `Environment: KEY=v1, OTHER=v2`.
|
|
381
|
+
* Разделители — `,` между парами; разделитель ключ/значение — `=`.
|
|
382
|
+
* Этот формат не выдерживает запятых в values; ограничение задокументировано.
|
|
383
|
+
*/
|
|
384
|
+
parseEnvSection(rawLines) {
|
|
385
|
+
const env = {};
|
|
386
|
+
// Найти индекс строки `Environment:`
|
|
387
|
+
const envHeaderIdx = rawLines.findIndex((l) => l.trim().startsWith('Environment:'));
|
|
388
|
+
if (envHeaderIdx === -1)
|
|
389
|
+
return env;
|
|
390
|
+
const envHeaderLine = rawLines[envHeaderIdx] ?? '';
|
|
391
|
+
const inline = envHeaderLine.slice(envHeaderLine.indexOf(':') + 1).trim();
|
|
392
|
+
if (inline.length > 0) {
|
|
393
|
+
// Однострочный формат (legacy): "Environment: K1=v1, K2=v2"
|
|
394
|
+
for (const pair of inline.split(',').map((s) => s.trim())) {
|
|
395
|
+
const eqIdx = pair.indexOf('=');
|
|
396
|
+
if (eqIdx > 0) {
|
|
397
|
+
env[pair.slice(0, eqIdx)] = pair.slice(eqIdx + 1);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return env;
|
|
401
|
+
}
|
|
402
|
+
// Многострочный формат: KEY=VALUE на каждой следующей строке с отступом.
|
|
403
|
+
// Останавливаемся при первой строке без отступа (пустая или новая секция).
|
|
404
|
+
for (let i = envHeaderIdx + 1; i < rawLines.length; i++) {
|
|
405
|
+
const raw = rawLines[i] ?? '';
|
|
406
|
+
const trimmed = raw.trim();
|
|
407
|
+
if (trimmed.length === 0)
|
|
408
|
+
break;
|
|
409
|
+
// Если строка без отступа — это новая секция (например, "To remove this server...")
|
|
410
|
+
const hasIndent = raw.startsWith(' ') || raw.startsWith('\t');
|
|
411
|
+
if (!hasIndent)
|
|
412
|
+
break;
|
|
413
|
+
const eqIdx = trimmed.indexOf('=');
|
|
414
|
+
if (eqIdx > 0) {
|
|
415
|
+
env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return env;
|
|
94
419
|
}
|
|
95
420
|
}
|
|
96
421
|
//# 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":"AAAA
|
|
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
|
|
22
|
-
* const
|
|
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
|
|
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
|
|
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;
|
|
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"}
|