zelari-code 2.20.0 → 2.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/main.bundled.js +461 -76
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +22 -5
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/mcp/httpTransport.js +184 -0
- package/dist/cli/mcp/httpTransport.js.map +1 -0
- package/dist/cli/mcp/mcpClient.js +153 -54
- package/dist/cli/mcp/mcpClient.js.map +1 -1
- package/dist/cli/mcp/mcpConfigIo.js +26 -5
- package/dist/cli/mcp/mcpConfigIo.js.map +1 -1
- package/dist/cli/mcp/mcpManager.js +51 -3
- package/dist/cli/mcp/mcpManager.js.map +1 -1
- package/dist/cli/mcp/mcpPresets.js +42 -1
- package/dist/cli/mcp/mcpPresets.js.map +1 -1
- package/dist/cli/provider/anthropic.js +30 -2
- package/dist/cli/provider/anthropic.js.map +1 -1
- package/dist/cli/provider/chatgpt.js +29 -2
- package/dist/cli/provider/chatgpt.js.map +1 -1
- package/dist/cli/provider/openai-compatible.js +3 -3
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/skillConfigIo.js +1 -0
- package/dist/cli/skillConfigIo.js.map +1 -1
- package/dist/cli/utils/doctor.js +10 -3
- package/dist/cli/utils/doctor.js.map +1 -1
- package/dist/cli/utils/prereqChecks.js +2 -2
- package/package.json +2 -2
|
@@ -1,38 +1,83 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* mcpClient — minimal Model Context Protocol client
|
|
2
|
+
* mcpClient — minimal Model Context Protocol client (stdio + Streamable HTTP).
|
|
3
3
|
*
|
|
4
4
|
* Implements exactly the slice of MCP the CLI needs to consume external
|
|
5
|
-
* tool servers: `initialize` handshake, `tools/list` discovery
|
|
6
|
-
* `tools/call` execution
|
|
7
|
-
* child process's stdin/stdout (the MCP stdio transport).
|
|
5
|
+
* tool servers: `initialize` handshake, `tools/list` discovery (with
|
|
6
|
+
* cursor pagination), and `tools/call` execution.
|
|
8
7
|
*
|
|
9
|
-
*
|
|
8
|
+
* Two transports behind one JSON-RPC pump:
|
|
9
|
+
* - stdio (default): newline-delimited JSON-RPC 2.0 over a child process
|
|
10
|
+
* - http (config `type: "http"` / `url`): Streamable HTTP — used by
|
|
11
|
+
* editor-embedded servers such as the Unreal Engine 5.8+ editor server
|
|
12
|
+
* (loopback, `Mcp-Session-Id`, JSON or SSE responses, 404 → re-handshake)
|
|
13
|
+
*
|
|
14
|
+
* No SDK dependency on purpose: the protocol slice stays ~250 lines and the
|
|
10
15
|
* official SDK would be the CLI's heaviest dependency by far.
|
|
11
16
|
*
|
|
12
|
-
* @see https://modelcontextprotocol.io/specification
|
|
17
|
+
* @see https://modelcontextprotocol.io/specification
|
|
13
18
|
*/
|
|
14
19
|
import { spawn } from "node:child_process";
|
|
15
20
|
import { buildCmdLine } from "../utils/cmdline.js";
|
|
16
21
|
import { getCurrentVersion } from "../updater.js";
|
|
22
|
+
import { McpHttpTransport } from "./httpTransport.js";
|
|
17
23
|
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
18
24
|
const INIT_TIMEOUT_MS = 15_000;
|
|
25
|
+
/** Guard against a broken server paginating forever. */
|
|
26
|
+
const MAX_LIST_PAGES = 50;
|
|
19
27
|
export const MCP_PROTOCOL_VERSION = "2025-03-26";
|
|
20
28
|
export class McpClient {
|
|
21
29
|
serverName;
|
|
22
30
|
config;
|
|
23
31
|
child = null;
|
|
32
|
+
transport = null;
|
|
24
33
|
nextId = 1;
|
|
25
34
|
pending = new Map();
|
|
26
35
|
stdoutBuffer = "";
|
|
27
36
|
closed = false;
|
|
37
|
+
/** Tail of the serial queue (config.serial); requests run one at a time. */
|
|
38
|
+
queueTail = Promise.resolve();
|
|
39
|
+
/** True while the 404-recovery handshake runs: bypasses the serial queue
|
|
40
|
+
* (the queued request that triggered the 404 is waiting on this handshake). */
|
|
41
|
+
recovering = false;
|
|
42
|
+
serial;
|
|
43
|
+
defaultTimeoutMs;
|
|
28
44
|
constructor(serverName, config) {
|
|
29
45
|
this.serverName = serverName;
|
|
30
46
|
this.config = config;
|
|
47
|
+
this.defaultTimeoutMs = config.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
48
|
+
this.serial = config.serial ?? this.transportKind() === "http";
|
|
49
|
+
}
|
|
50
|
+
transportKind() {
|
|
51
|
+
if (this.config.type)
|
|
52
|
+
return this.config.type;
|
|
53
|
+
return this.config.url && !this.config.command ? "http" : "stdio";
|
|
31
54
|
}
|
|
32
|
-
/**
|
|
55
|
+
/** Connect (spawn / HTTP session) and run the MCP initialize handshake. */
|
|
33
56
|
async start() {
|
|
34
|
-
if (this.child)
|
|
57
|
+
if (this.child || this.transport)
|
|
58
|
+
return;
|
|
59
|
+
if (this.transportKind() === "http") {
|
|
60
|
+
const url = this.config.url;
|
|
61
|
+
if (!url) {
|
|
62
|
+
throw new Error(`[mcp:${this.serverName}] http server requires a url`);
|
|
63
|
+
}
|
|
64
|
+
this.transport = new McpHttpTransport({
|
|
65
|
+
serverName: this.serverName,
|
|
66
|
+
url,
|
|
67
|
+
// env may carry an explicit Authorization header for remote servers.
|
|
68
|
+
headers: this.config.env?.AUTHORIZATION
|
|
69
|
+
? { Authorization: this.config.env.AUTHORIZATION }
|
|
70
|
+
: undefined,
|
|
71
|
+
onMessage: (msg) => this.handleMessage(msg),
|
|
72
|
+
onSessionLost: () => this.handshake(),
|
|
73
|
+
});
|
|
74
|
+
await this.handshake();
|
|
35
75
|
return;
|
|
76
|
+
}
|
|
77
|
+
const command = this.config.command;
|
|
78
|
+
if (!command) {
|
|
79
|
+
throw new Error(`[mcp:${this.serverName}] stdio server requires a command`);
|
|
80
|
+
}
|
|
36
81
|
const spawnOpts = {
|
|
37
82
|
stdio: ["pipe", "pipe", "pipe"],
|
|
38
83
|
env: { ...process.env, ...(this.config.env ?? {}) },
|
|
@@ -43,11 +88,11 @@ export class McpClient {
|
|
|
43
88
|
// with shell:true is deprecated (DEP0190: args concatenated unescaped).
|
|
44
89
|
// Build the command line ourselves with explicit quoting instead.
|
|
45
90
|
const child = (process.platform === "win32"
|
|
46
|
-
? spawn(buildCmdLine(
|
|
91
|
+
? spawn(buildCmdLine(command, this.config.args ?? []), {
|
|
47
92
|
...spawnOpts,
|
|
48
93
|
shell: true,
|
|
49
94
|
})
|
|
50
|
-
: spawn(
|
|
95
|
+
: spawn(command, this.config.args ?? [], spawnOpts));
|
|
51
96
|
this.child = child;
|
|
52
97
|
child.stdout.setEncoding("utf8");
|
|
53
98
|
child.stdout.on("data", (chunk) => this.onStdout(chunk));
|
|
@@ -57,30 +102,53 @@ export class McpClient {
|
|
|
57
102
|
this.failAll(new Error(`[mcp:${this.serverName}] server exited (code ${code ?? "null"})`));
|
|
58
103
|
}
|
|
59
104
|
});
|
|
60
|
-
await this.
|
|
61
|
-
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
62
|
-
capabilities: {},
|
|
63
|
-
clientInfo: { name: "zelari-code", version: getCurrentVersion() },
|
|
64
|
-
}, INIT_TIMEOUT_MS);
|
|
65
|
-
this.notify("notifications/initialized", {});
|
|
105
|
+
await this.handshake();
|
|
66
106
|
}
|
|
67
|
-
|
|
107
|
+
async handshake() {
|
|
108
|
+
const prev = this.recovering;
|
|
109
|
+
this.recovering = true;
|
|
110
|
+
try {
|
|
111
|
+
await this.request("initialize", {
|
|
112
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
113
|
+
capabilities: {},
|
|
114
|
+
clientInfo: { name: "zelari-code", version: getCurrentVersion() },
|
|
115
|
+
}, INIT_TIMEOUT_MS);
|
|
116
|
+
this.notify("notifications/initialized", {});
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
this.recovering = prev;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Discover the server's tools. Follows `nextCursor` pagination so
|
|
124
|
+
* large servers (hundreds of tools) are listed completely.
|
|
125
|
+
*/
|
|
68
126
|
async listTools() {
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
127
|
+
const tools = [];
|
|
128
|
+
let cursor;
|
|
129
|
+
for (let page = 0; page < MAX_LIST_PAGES; page++) {
|
|
130
|
+
const res = (await this.request("tools/list", cursor ? { cursor } : {}));
|
|
131
|
+
for (const t of res.tools ?? []) {
|
|
132
|
+
if (!t.name)
|
|
133
|
+
continue;
|
|
134
|
+
tools.push({
|
|
135
|
+
name: t.name,
|
|
136
|
+
description: t.description ?? "",
|
|
137
|
+
inputSchema: t.inputSchema ?? { type: "object", properties: {} },
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
cursor = typeof res.nextCursor === "string" ? res.nextCursor : undefined;
|
|
141
|
+
if (!cursor)
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
return tools;
|
|
77
145
|
}
|
|
78
146
|
/**
|
|
79
147
|
* Call a tool. Returns the concatenated text content; non-text content
|
|
80
148
|
* items are summarized by type. Throws when the server flags isError.
|
|
81
149
|
*/
|
|
82
|
-
async callTool(name, args, timeoutMs
|
|
83
|
-
const res = (await this.request("tools/call", { name, arguments: args }, timeoutMs));
|
|
150
|
+
async callTool(name, args, timeoutMs) {
|
|
151
|
+
const res = (await this.request("tools/call", { name, arguments: args }, timeoutMs ?? this.defaultTimeoutMs));
|
|
84
152
|
const text = (res.content ?? [])
|
|
85
153
|
.map((c) => c.type === "text" && typeof c.text === "string"
|
|
86
154
|
? c.text
|
|
@@ -90,36 +158,64 @@ export class McpClient {
|
|
|
90
158
|
throw new Error(text || `tool "${name}" reported an error`);
|
|
91
159
|
return text;
|
|
92
160
|
}
|
|
93
|
-
/** Terminate the server
|
|
161
|
+
/** Terminate the server / session and reject all in-flight requests. */
|
|
94
162
|
close() {
|
|
95
163
|
this.closed = true;
|
|
96
164
|
this.failAll(new Error(`[mcp:${this.serverName}] client closed`));
|
|
165
|
+
if (this.transport) {
|
|
166
|
+
this.transport.close();
|
|
167
|
+
this.transport = null;
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
97
170
|
this.child?.kill();
|
|
98
171
|
this.child = null;
|
|
99
172
|
}
|
|
100
|
-
// ── JSON-RPC plumbing
|
|
101
|
-
request(method, params, timeoutMs
|
|
173
|
+
// ── JSON-RPC plumbing (shared by both transports) ────────────────────
|
|
174
|
+
request(method, params, timeoutMs) {
|
|
175
|
+
const effective = timeoutMs ?? this.defaultTimeoutMs;
|
|
176
|
+
// Recovery handshakes bypass the queue: the queued request that hit the
|
|
177
|
+
// 404 is parked waiting for this handshake to finish.
|
|
178
|
+
if (!this.serial || this.recovering)
|
|
179
|
+
return this.dispatch(method, params, effective);
|
|
180
|
+
// Serial mode (http default): one request in flight per server. The
|
|
181
|
+
// tail swallows rejections so a failure never blocks the queue.
|
|
182
|
+
const run = this.queueTail.then(() => this.dispatch(method, params, effective), () => this.dispatch(method, params, effective));
|
|
183
|
+
this.queueTail = run.then(() => undefined, () => undefined);
|
|
184
|
+
return run;
|
|
185
|
+
}
|
|
186
|
+
dispatch(method, params, timeoutMs) {
|
|
187
|
+
const transport = this.transport;
|
|
102
188
|
const child = this.child;
|
|
103
|
-
if (!child)
|
|
189
|
+
if (!transport && !child)
|
|
104
190
|
return Promise.reject(new Error(`[mcp:${this.serverName}] not started`));
|
|
105
191
|
const id = this.nextId++;
|
|
106
|
-
const payload = JSON.stringify({ jsonrpc: "2.0", id, method, params });
|
|
107
192
|
return new Promise((resolve, reject) => {
|
|
108
193
|
const timer = setTimeout(() => {
|
|
109
194
|
this.pending.delete(id);
|
|
110
195
|
reject(new Error(`[mcp:${this.serverName}] ${method} timed out after ${timeoutMs}ms`));
|
|
111
196
|
}, timeoutMs);
|
|
112
197
|
this.pending.set(id, { resolve, reject, timer });
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
198
|
+
if (transport) {
|
|
199
|
+
// Transport-level failures come back as JSON-RPC error messages.
|
|
200
|
+
void transport.send({ id, method, params }, timeoutMs);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
const payload = JSON.stringify({ jsonrpc: "2.0", id, method, params });
|
|
204
|
+
child.stdin.write(payload + "\n", (err) => {
|
|
205
|
+
if (err) {
|
|
206
|
+
clearTimeout(timer);
|
|
207
|
+
this.pending.delete(id);
|
|
208
|
+
reject(err);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
120
212
|
});
|
|
121
213
|
}
|
|
122
214
|
notify(method, params) {
|
|
215
|
+
if (this.transport) {
|
|
216
|
+
void this.transport.send({ method, params }, this.defaultTimeoutMs);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
123
219
|
this.child?.stdin.write(JSON.stringify({ jsonrpc: "2.0", method, params }) + "\n");
|
|
124
220
|
}
|
|
125
221
|
onStdout(chunk) {
|
|
@@ -130,26 +226,29 @@ export class McpClient {
|
|
|
130
226
|
this.stdoutBuffer = this.stdoutBuffer.slice(nl + 1);
|
|
131
227
|
if (!line)
|
|
132
228
|
continue;
|
|
133
|
-
let msg;
|
|
134
229
|
try {
|
|
135
|
-
|
|
230
|
+
this.handleMessage(JSON.parse(line));
|
|
136
231
|
}
|
|
137
232
|
catch {
|
|
138
233
|
continue; // servers sometimes log garbage to stdout — ignore non-JSON
|
|
139
234
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** Route one parsed JSON-RPC message to its pending request (both transports). */
|
|
238
|
+
handleMessage(msg) {
|
|
239
|
+
const m = msg;
|
|
240
|
+
if (typeof m.id !== "number")
|
|
241
|
+
return; // server notification — none handled
|
|
242
|
+
const pending = this.pending.get(m.id);
|
|
243
|
+
if (!pending)
|
|
244
|
+
return; // already timed out / closed — ignore
|
|
245
|
+
this.pending.delete(m.id);
|
|
246
|
+
clearTimeout(pending.timer);
|
|
247
|
+
if (m.error) {
|
|
248
|
+
pending.reject(new Error(`[mcp:${this.serverName}] ${m.error.message ?? "JSON-RPC error"} (code ${m.error.code ?? "?"})`));
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
pending.resolve(m.result);
|
|
153
252
|
}
|
|
154
253
|
}
|
|
155
254
|
failAll(err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpClient.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,14 +19,26 @@ function readFile(path) {
|
|
|
19
19
|
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
20
20
|
const out = {};
|
|
21
21
|
for (const [name, cfg] of Object.entries(parsed.mcpServers ?? {})) {
|
|
22
|
-
|
|
22
|
+
const hasCommand = !!cfg && typeof cfg.command === 'string' && !!cfg.command.trim();
|
|
23
|
+
const hasUrl = !!cfg && typeof cfg.url === 'string' && /^https?:\/\//i.test(cfg.url);
|
|
24
|
+
if (!cfg || (!hasCommand && !hasUrl))
|
|
23
25
|
continue;
|
|
24
26
|
out[name] = {
|
|
25
|
-
command: cfg.command.trim(),
|
|
27
|
+
command: hasCommand ? cfg.command.trim() : undefined,
|
|
26
28
|
args: Array.isArray(cfg.args) ? cfg.args.map(String) : undefined,
|
|
27
29
|
env: cfg.env && typeof cfg.env === 'object'
|
|
28
30
|
? cfg.env
|
|
29
31
|
: undefined,
|
|
32
|
+
type: hasUrl && !hasCommand
|
|
33
|
+
? 'http'
|
|
34
|
+
: cfg.type === 'http'
|
|
35
|
+
? 'http'
|
|
36
|
+
: 'stdio',
|
|
37
|
+
url: hasUrl ? cfg.url.trim() : undefined,
|
|
38
|
+
timeoutMs: typeof cfg.timeoutMs === 'number' && cfg.timeoutMs > 0
|
|
39
|
+
? cfg.timeoutMs
|
|
40
|
+
: undefined,
|
|
41
|
+
serial: typeof cfg.serial === 'boolean' ? cfg.serial : undefined,
|
|
30
42
|
enabled: cfg.enabled !== false,
|
|
31
43
|
};
|
|
32
44
|
}
|
|
@@ -71,8 +83,13 @@ export function upsertMcpServer(opts) {
|
|
|
71
83
|
error: 'Invalid server name (use letters, digits, _ -)',
|
|
72
84
|
};
|
|
73
85
|
}
|
|
74
|
-
|
|
75
|
-
|
|
86
|
+
const hasCommand = !!opts.config.command?.trim();
|
|
87
|
+
const hasUrl = typeof opts.config.url === 'string' && /^https?:\/\//i.test(opts.config.url);
|
|
88
|
+
if (!hasCommand && !hasUrl) {
|
|
89
|
+
return {
|
|
90
|
+
ok: false,
|
|
91
|
+
error: 'either command (stdio) or url (http) is required',
|
|
92
|
+
};
|
|
76
93
|
}
|
|
77
94
|
let path;
|
|
78
95
|
if (opts.scope === 'user') {
|
|
@@ -90,9 +107,13 @@ export function upsertMcpServer(opts) {
|
|
|
90
107
|
}
|
|
91
108
|
const current = readFile(path);
|
|
92
109
|
current[name] = {
|
|
93
|
-
command: opts.config.command.trim(),
|
|
110
|
+
command: hasCommand ? opts.config.command.trim() : undefined,
|
|
94
111
|
args: opts.config.args,
|
|
95
112
|
env: opts.config.env,
|
|
113
|
+
type: hasUrl ? 'http' : opts.config.type === 'http' ? 'http' : 'stdio',
|
|
114
|
+
url: hasUrl ? opts.config.url.trim() : undefined,
|
|
115
|
+
timeoutMs: opts.config.timeoutMs,
|
|
116
|
+
serial: opts.config.serial,
|
|
96
117
|
enabled: opts.config.enabled !== false,
|
|
97
118
|
};
|
|
98
119
|
writeFile(path, current);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpConfigIo.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpConfigIo.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAgBlC,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAkB,CAAC;QACvE,MAAM,GAAG,GAAoC,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YAClE,
|
|
1
|
+
{"version":3,"file":"mcpConfigIo.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpConfigIo.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ import { McpClient } from './mcpClient.js';
|
|
|
26
26
|
import { isCuaAllowedForCouncil, isCuaDisabled, isCuaMcpServerName, } from './mcpPresets.js';
|
|
27
27
|
import { isFolderTrusted } from '../safety/folderTrust.js';
|
|
28
28
|
/** Module-level session cache. */
|
|
29
|
-
const state = { loaded: false, tools: [], warnings: [], clients: [] };
|
|
29
|
+
const state = { loaded: false, tools: [], warnings: [], clients: [], pendingHttp: [] };
|
|
30
30
|
/**
|
|
31
31
|
* Read + merge MCP config files (project entries win on name conflict).
|
|
32
32
|
*
|
|
@@ -54,7 +54,9 @@ export function readMcpConfig(projectRoot = process.cwd(), opts) {
|
|
|
54
54
|
try {
|
|
55
55
|
const parsed = JSON.parse(readFileSync(p, 'utf8'));
|
|
56
56
|
for (const [name, cfg] of Object.entries(parsed.mcpServers ?? {})) {
|
|
57
|
-
|
|
57
|
+
const hasCommand = !!cfg && typeof cfg.command === 'string' && cfg.command.length > 0;
|
|
58
|
+
const hasUrl = !!cfg && typeof cfg.url === 'string' && /^https?:\/\//i.test(cfg.url);
|
|
59
|
+
if (!cfg || (!hasCommand && !hasUrl))
|
|
58
60
|
continue;
|
|
59
61
|
merged[name] = cfg;
|
|
60
62
|
}
|
|
@@ -102,9 +104,53 @@ async function ensureLoaded(projectRoot) {
|
|
|
102
104
|
}
|
|
103
105
|
catch (err) {
|
|
104
106
|
client.close();
|
|
105
|
-
|
|
107
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
108
|
+
if (isHttpConfig(cfg)) {
|
|
109
|
+
// HTTP servers (e.g. the UE 5.8+ editor) often start AFTER the CLI:
|
|
110
|
+
// keep them pending instead of disabling — discovery is retried on
|
|
111
|
+
// every subsequent turn until the editor answers.
|
|
112
|
+
state.pendingHttp.push({ name, cfg });
|
|
113
|
+
state.warnings.push(`[mcp:${name}] not reachable yet (${msg}) — will retry each turn`);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
state.warnings.push(`[mcp:${name}] disabled: ${msg}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function isHttpConfig(cfg) {
|
|
122
|
+
return cfg.type === 'http' || (!!cfg.url && !cfg.command);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Retry HTTP servers that were unreachable at first discovery — the editor
|
|
126
|
+
* (UE 5.8+) may have started since. Silent on failure: the warning was
|
|
127
|
+
* already surfaced once at initial discovery.
|
|
128
|
+
*/
|
|
129
|
+
async function retryPendingHttp() {
|
|
130
|
+
if (state.pendingHttp.length === 0)
|
|
131
|
+
return;
|
|
132
|
+
const remaining = [];
|
|
133
|
+
for (const p of state.pendingHttp) {
|
|
134
|
+
const client = new McpClient(p.name, p.cfg);
|
|
135
|
+
try {
|
|
136
|
+
await client.start();
|
|
137
|
+
const tools = await client.listTools();
|
|
138
|
+
state.clients.push(client);
|
|
139
|
+
for (const info of tools) {
|
|
140
|
+
state.tools.push({
|
|
141
|
+
registryName: sanitizeToolName(`mcp_${p.name}_${info.name}`),
|
|
142
|
+
serverName: p.name,
|
|
143
|
+
info,
|
|
144
|
+
client,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
client.close();
|
|
150
|
+
remaining.push(p);
|
|
106
151
|
}
|
|
107
152
|
}
|
|
153
|
+
state.pendingHttp = remaining;
|
|
108
154
|
}
|
|
109
155
|
/** OpenAI tool names must match ^[a-zA-Z0-9_-]{1,64}$. */
|
|
110
156
|
function sanitizeToolName(raw) {
|
|
@@ -121,6 +167,7 @@ export async function registerMcpTools(registry, projectRoot = process.cwd(), op
|
|
|
121
167
|
if (process.env['ZELARI_MCP'] === '0')
|
|
122
168
|
return { registered: [], warnings: [] };
|
|
123
169
|
await ensureLoaded(projectRoot);
|
|
170
|
+
await retryPendingHttp();
|
|
124
171
|
const skipCuaForCouncil = opts?.councilMode === true && !isCuaAllowedForCouncil();
|
|
125
172
|
const registered = [];
|
|
126
173
|
for (const t of state.tools) {
|
|
@@ -163,6 +210,7 @@ export function closeMcpClients() {
|
|
|
163
210
|
state.tools = [];
|
|
164
211
|
state.loaded = false;
|
|
165
212
|
state.warnings = [];
|
|
213
|
+
state.pendingHttp = [];
|
|
166
214
|
}
|
|
167
215
|
/** Test hook: reset the module cache. */
|
|
168
216
|
export function _resetMcpForTests() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpManager.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAoB,MAAM,sCAAsC,CAAC;AAC3F,OAAO,EAAE,SAAS,EAA0C,MAAM,gBAAgB,CAAC;AACnF,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAc3D,kCAAkC;AAClC,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"mcpManager.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -98,15 +98,56 @@ export function buildQwenMmPreset() {
|
|
|
98
98
|
],
|
|
99
99
|
};
|
|
100
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Unreal Engine 5.8+ editor MCP preset. The editor embeds an MCP server
|
|
103
|
+
* (Streamable HTTP on loopback, Experimental in 5.8) exposing Tool Search
|
|
104
|
+
* meta-tools: list_toolsets / describe_toolset / call_tool.
|
|
105
|
+
*
|
|
106
|
+
* Editor setup: enable the "Model Context Protocol" plugin, then turn on
|
|
107
|
+
* the MCP server under Edit → Project Settings → Plugins (default
|
|
108
|
+
* http://127.0.0.1:8000/mcp — port and path are configurable there).
|
|
109
|
+
*/
|
|
110
|
+
export function buildUnrealPreset() {
|
|
111
|
+
const url = process.env.UNREAL_MCP_URL?.trim() || "http://127.0.0.1:8000/mcp";
|
|
112
|
+
return {
|
|
113
|
+
id: "unreal-mcp",
|
|
114
|
+
servers: {
|
|
115
|
+
"unreal-mcp": {
|
|
116
|
+
type: "http",
|
|
117
|
+
url,
|
|
118
|
+
// Editor tool calls (asset scans, builds, PIE) can be slow.
|
|
119
|
+
timeoutMs: 120_000,
|
|
120
|
+
// Epic guidance: never overlap calls on the editor's game thread.
|
|
121
|
+
serial: true,
|
|
122
|
+
enabled: true,
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
notes: [
|
|
126
|
+
"Unreal Engine 5.8+ — MCP server embedded in the editor (Experimental feature).",
|
|
127
|
+
"Editor: enable the 'Model Context Protocol' plugin, then Edit → Project Settings → Plugins → MCP Server.",
|
|
128
|
+
`Endpoint: ${url} (override with UNREAL_MCP_URL; port/path configurable in the editor).`,
|
|
129
|
+
"Tool Search ON by default: tools surface as list_toolsets / describe_toolset / call_tool.",
|
|
130
|
+
"Requests are serialized and time out after 120s (editor tools can be slow).",
|
|
131
|
+
"Start the editor before OR after zelari — unreachable servers are retried on each turn.",
|
|
132
|
+
"Kill switch: disable the unreal-mcp server in mcp.json or ZELARI_MCP=0",
|
|
133
|
+
],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
101
136
|
const PRESETS = {
|
|
102
137
|
cua: () => CUA_DRIVER_PRESET,
|
|
103
138
|
"cua-driver": () => CUA_DRIVER_PRESET,
|
|
104
139
|
composio: buildComposioPreset,
|
|
105
140
|
"qwen-mm-plugins": buildQwenMmPreset,
|
|
106
141
|
"qwen-mm": buildQwenMmPreset,
|
|
142
|
+
unreal: buildUnrealPreset,
|
|
143
|
+
"unreal-mcp": buildUnrealPreset,
|
|
144
|
+
unrealEditor: buildUnrealPreset,
|
|
107
145
|
};
|
|
108
146
|
export function listMcpPresetIds() {
|
|
109
|
-
return Object.keys(PRESETS).filter((k) => k === "cua" ||
|
|
147
|
+
return Object.keys(PRESETS).filter((k) => k === "cua" ||
|
|
148
|
+
k === "composio" ||
|
|
149
|
+
k === "qwen-mm-plugins" ||
|
|
150
|
+
k === "unreal-mcp"); // canonical ids only
|
|
110
151
|
}
|
|
111
152
|
export function getMcpPreset(id) {
|
|
112
153
|
const factory = PRESETS[id.trim().toLowerCase()];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpPresets.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpPresets.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAU1B,0EAA0E;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,EAAE,EAAE,KAAK;IACT,OAAO,EAAE;QACP,YAAY,EAAE;YACZ,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,CAAC,KAAK,CAAC;YACb,OAAO,EAAE,IAAI;SACd;KACF;IACD,KAAK,EAAE;QACL,4EAA4E;QAC5E,mEAAmE;QACnE,qDAAqD;QACrD,8EAA8E;QAC9E,mEAAmE;QACnE,4EAA4E;KAC7E;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,EAAE,UAAU;QACd,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC;gBACnC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;oBAC/B,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE;oBACpD,CAAC,CAAC,EAAE;gBACN,OAAO,EAAE,IAAI;aACd;SACF;QACD,KAAK,EAAE;YACL,qFAAqF;YACrF,qEAAqE;YACrE,+EAA+E;YAC/E,mDAAmD;YACnD,sEAAsE;SACvE;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,sBAAsB,CAAC;IAC5E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,mBAAmB,GAAG,yDAAyD,MAAM,SAAS,CAAC;IAC5G,OAAO;QACL,EAAE,EAAE,iBAAiB;QACrB,OAAO,EAAE;YACP,iBAAiB,EAAE;gBACjB,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC;gBAC9B,GAAG,EAAE;oBACH,gBAAgB,EAAE,OAAO;oBACzB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;wBAC/B,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;wBACtD,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;wBAC5B,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE;wBAChD,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,OAAO,EAAE,IAAI;aACd;SACF;QACD,KAAK,EAAE;YACL,gHAAgH;YAChH,mHAAmH;YACnH,gGAAgG;YAChG,wGAAwG;YACxG,qGAAqG;YACrG,qEAAqE;YACrE,6EAA6E;SAC9E;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAoC;IAC/C,GAAG,EAAE,GAAG,EAAE,CAAC,iBAAiB;IAC5B,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB;IACrC,QAAQ,EAAE,mBAAmB;IAC7B,iBAAiB,EAAE,iBAAiB;IACpC,SAAS,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"mcpPresets.js","sourceRoot":"","sources":["../../../src/cli/mcp/mcpPresets.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAU1B,0EAA0E;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,EAAE,EAAE,KAAK;IACT,OAAO,EAAE;QACP,YAAY,EAAE;YACZ,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,CAAC,KAAK,CAAC;YACb,OAAO,EAAE,IAAI;SACd;KACF;IACD,KAAK,EAAE;QACL,4EAA4E;QAC5E,mEAAmE;QACnE,qDAAqD;QACrD,8EAA8E;QAC9E,mEAAmE;QACnE,4EAA4E;KAC7E;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,EAAE,UAAU;QACd,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC;gBACnC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;oBAC/B,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE;oBACpD,CAAC,CAAC,EAAE;gBACN,OAAO,EAAE,IAAI;aACd;SACF;QACD,KAAK,EAAE;YACL,qFAAqF;YACrF,qEAAqE;YACrE,+EAA+E;YAC/E,mDAAmD;YACnD,sEAAsE;SACvE;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,sBAAsB,CAAC;IAC5E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,mBAAmB,GAAG,yDAAyD,MAAM,SAAS,CAAC;IAC5G,OAAO;QACL,EAAE,EAAE,iBAAiB;QACrB,OAAO,EAAE;YACP,iBAAiB,EAAE;gBACjB,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC;gBAC9B,GAAG,EAAE;oBACH,gBAAgB,EAAE,OAAO;oBACzB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;wBAC/B,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;wBACtD,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;wBAC5B,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE;wBAChD,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,OAAO,EAAE,IAAI;aACd;SACF;QACD,KAAK,EAAE;YACL,gHAAgH;YAChH,mHAAmH;YACnH,gGAAgG;YAChG,wGAAwG;YACxG,qGAAqG;YACrG,qEAAqE;YACrE,6EAA6E;SAC9E;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,2BAA2B,CAAC;IAC9E,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,OAAO,EAAE;YACP,YAAY,EAAE;gBACZ,IAAI,EAAE,MAAM;gBACZ,GAAG;gBACH,4DAA4D;gBAC5D,SAAS,EAAE,OAAO;gBAClB,kEAAkE;gBAClE,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,IAAI;aACd;SACF;QACD,KAAK,EAAE;YACL,gFAAgF;YAChF,0GAA0G;YAC1G,aAAa,GAAG,wEAAwE;YACxF,2FAA2F;YAC3F,6EAA6E;YAC7E,yFAAyF;YACzF,wEAAwE;SACzE;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAoC;IAC/C,GAAG,EAAE,GAAG,EAAE,CAAC,iBAAiB;IAC5B,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB;IACrC,QAAQ,EAAE,mBAAmB;IAC7B,iBAAiB,EAAE,iBAAiB;IACpC,SAAS,EAAE,iBAAiB;IAC5B,MAAM,EAAE,iBAAiB;IACzB,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,iBAAiB;CAChC,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,KAAK,KAAK;QACX,CAAC,KAAK,UAAU;QAChB,CAAC,KAAK,iBAAiB;QACvB,CAAC,KAAK,YAAY,CACrB,CAAC,CAAC,qBAAqB;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAI9B;IAGC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,mBAAmB,IAAI,CAAC,QAAQ,aAAa,gBAAgB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACpF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACnC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,GAAG,eAAe,CAAC;YACxB,KAAK;YACL,IAAI;YACJ,MAAM;YACN,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAChD,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC9D,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,OAAO,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,GAAG,CAAC;AACnD,CAAC"}
|