@musnows/scriverse 0.9.5 → 0.9.7

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.
@@ -0,0 +1,496 @@
1
+ import { createHash } from "node:crypto";
2
+ import { Client, SSEClientTransport, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
3
+ import { z } from "zod";
4
+ import { AppError } from "./errors.js";
5
+ import { logger } from "./logger.js";
6
+ import { fetchSafeAiEndpoint } from "./security.js";
7
+ import { APP_VERSION } from "./version.js";
8
+ export const MCP_SECRET_MASK = "********";
9
+ const MAXIMUM_MCP_SERVERS = 20;
10
+ const MAXIMUM_MCP_HEADERS = 64;
11
+ const MAXIMUM_MCP_TOOLS = 200;
12
+ const MAXIMUM_MCP_TOOLS_PER_SERVER = 100;
13
+ const MAXIMUM_MCP_TOOL_PAGES = 20;
14
+ const MAXIMUM_MCP_CONFIG_CHARS = 256_000;
15
+ const MAXIMUM_MCP_TOOL_SCHEMA_CHARS = 64_000;
16
+ const MCP_CONNECT_TIMEOUT_MS = 12_000;
17
+ const MCP_TOOL_CALL_TIMEOUT_MS = 60_000;
18
+ const forbiddenLocalServerFields = ["command", "args", "env", "cwd"];
19
+ const forbiddenHeaderNames = new Set([
20
+ "accept",
21
+ "connection",
22
+ "content-length",
23
+ "content-type",
24
+ "host",
25
+ "mcp-protocol-version",
26
+ "mcp-session-id",
27
+ "te",
28
+ "trailer",
29
+ "transfer-encoding",
30
+ "upgrade"
31
+ ]);
32
+ const mcpTransportSchema = z.enum(["auto", "sse", "streamable-http", "streamableHttp", "stream-http", "http"]);
33
+ const mcpServerSchema = z.object({
34
+ url: z.string().trim().min(1).max(2_048),
35
+ type: mcpTransportSchema.optional(),
36
+ transport: mcpTransportSchema.optional(),
37
+ headers: z.record(z.string().min(1).max(200), z.string().max(4_096)).optional()
38
+ }).strict();
39
+ const mcpConfigurationSchema = z.object({
40
+ mcpServers: z.record(z.string().trim().min(1).max(100), mcpServerSchema)
41
+ }).strict();
42
+ const mcpToolCatalogEntrySchema = z.object({
43
+ serverName: z.string().min(1).max(100),
44
+ serverToolName: z.string().min(1).max(300),
45
+ modelToolName: z.string().min(1).max(64),
46
+ description: z.string().max(4_000),
47
+ inputSchema: z.record(z.string(), z.unknown()),
48
+ transport: z.enum(["sse", "streamable-http"]),
49
+ serverVersion: z.string().max(300)
50
+ }).strict();
51
+ const mcpToolCatalogSchema = z.array(mcpToolCatalogEntrySchema).max(MAXIMUM_MCP_TOOLS);
52
+ function recordValue(value) {
53
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
54
+ }
55
+ function normalizedTransport(value) {
56
+ if (!value || value === "auto")
57
+ return "auto";
58
+ return value === "sse" ? "sse" : "streamable-http";
59
+ }
60
+ function isSensitiveHeader(name) {
61
+ const normalized = name.toLocaleLowerCase("en-US");
62
+ return normalized === "authorization"
63
+ || normalized === "proxy-authorization"
64
+ || normalized === "cookie"
65
+ || normalized.includes("token")
66
+ || normalized.includes("secret")
67
+ || /(?:^|[-_])api[-_]?key$/u.test(normalized)
68
+ || /(?:^|[-_])key$/u.test(normalized);
69
+ }
70
+ function configurationForStorage(configuration) {
71
+ return {
72
+ mcpServers: Object.fromEntries(Object.entries(configuration.mcpServers).map(([serverName, server]) => [
73
+ serverName,
74
+ {
75
+ ...(server.transport === "auto" ? {} : { type: server.transport }),
76
+ url: server.url,
77
+ ...(Object.keys(server.headers).length > 0 ? { headers: server.headers } : {})
78
+ }
79
+ ]))
80
+ };
81
+ }
82
+ function redactedConfiguration(configuration) {
83
+ return {
84
+ mcpServers: Object.fromEntries(Object.entries(configuration.mcpServers).map(([serverName, server]) => [
85
+ serverName,
86
+ {
87
+ ...(server.transport === "auto" ? {} : { type: server.transport }),
88
+ url: server.url,
89
+ ...(Object.keys(server.headers).length > 0
90
+ ? {
91
+ headers: Object.fromEntries(Object.entries(server.headers).map(([name, value]) => [
92
+ name,
93
+ isSensitiveHeader(name) && value ? MCP_SECRET_MASK : value
94
+ ]))
95
+ }
96
+ : {})
97
+ }
98
+ ]))
99
+ };
100
+ }
101
+ function configurationIssueMessage(error) {
102
+ return error.issues
103
+ .slice(0, 6)
104
+ .map((issue) => `${issue.path.join(".") || "配置"}:${issue.message}`)
105
+ .join(";");
106
+ }
107
+ export function parseRemoteMcpConfiguration(input, previous, allowLiteralSecretMask = false) {
108
+ const root = recordValue(input);
109
+ const rawServers = recordValue(root?.mcpServers);
110
+ if (rawServers) {
111
+ for (const [serverName, rawServer] of Object.entries(rawServers)) {
112
+ const server = recordValue(rawServer);
113
+ if (!server)
114
+ continue;
115
+ const localField = forbiddenLocalServerFields.find((field) => Object.hasOwn(server, field));
116
+ if (localField) {
117
+ throw new AppError(400, "MCP_LOCAL_TRANSPORT_FORBIDDEN", `MCP Server“${serverName}”包含本地 ${localField} 配置;叙界只支持远程 SSE 或 Streamable HTTP MCP Server`);
118
+ }
119
+ }
120
+ }
121
+ const parsed = mcpConfigurationSchema.safeParse(input);
122
+ if (!parsed.success) {
123
+ throw new AppError(400, "MCP_CONFIG_INVALID", `MCP 配置不符合 mcpServers 规范:${configurationIssueMessage(parsed.error)}`);
124
+ }
125
+ const entries = Object.entries(parsed.data.mcpServers);
126
+ if (entries.length > MAXIMUM_MCP_SERVERS) {
127
+ throw new AppError(400, "MCP_SERVER_LIMIT_EXCEEDED", `每部作品最多配置 ${MAXIMUM_MCP_SERVERS} 个 MCP Server`);
128
+ }
129
+ const normalizedServers = {};
130
+ for (const [serverName, server] of entries) {
131
+ if (server.type && server.transport && normalizedTransport(server.type) !== normalizedTransport(server.transport)) {
132
+ throw new AppError(400, "MCP_TRANSPORT_CONFLICT", `MCP Server“${serverName}”的 type 与 transport 配置冲突`);
133
+ }
134
+ let endpoint;
135
+ try {
136
+ endpoint = new URL(server.url);
137
+ }
138
+ catch {
139
+ throw new AppError(400, "MCP_SERVER_URL_INVALID", `MCP Server“${serverName}”的 url 不是有效地址`);
140
+ }
141
+ if (!["http:", "https:"].includes(endpoint.protocol) || endpoint.username || endpoint.password) {
142
+ throw new AppError(400, "MCP_REMOTE_TRANSPORT_REQUIRED", `MCP Server“${serverName}”必须使用无内嵌凭据的 HTTP(S) 远程地址`);
143
+ }
144
+ const headers = server.headers ?? {};
145
+ if (Object.keys(headers).length > MAXIMUM_MCP_HEADERS) {
146
+ throw new AppError(400, "MCP_HEADER_LIMIT_EXCEEDED", `MCP Server“${serverName}”的 header 数量不能超过 ${MAXIMUM_MCP_HEADERS}`);
147
+ }
148
+ const normalizedHeaderNames = new Set();
149
+ const resolvedHeaders = {};
150
+ for (const [name, configuredValue] of Object.entries(headers)) {
151
+ const normalizedName = name.toLocaleLowerCase("en-US");
152
+ if (normalizedHeaderNames.has(normalizedName)) {
153
+ throw new AppError(400, "MCP_HEADER_DUPLICATED", `MCP Server“${serverName}”包含重复 header“${name}”`);
154
+ }
155
+ normalizedHeaderNames.add(normalizedName);
156
+ if (forbiddenHeaderNames.has(normalizedName)) {
157
+ throw new AppError(400, "MCP_HEADER_FORBIDDEN", `MCP Server“${serverName}”不能覆盖协议 header“${name}”`);
158
+ }
159
+ try {
160
+ new Headers([[name, configuredValue]]);
161
+ }
162
+ catch {
163
+ throw new AppError(400, "MCP_HEADER_INVALID", `MCP Server“${serverName}”的 header“${name}”无效`);
164
+ }
165
+ if (configuredValue === MCP_SECRET_MASK && isSensitiveHeader(name) && !allowLiteralSecretMask) {
166
+ const previousHeader = Object.entries(previous?.mcpServers[serverName]?.headers ?? {})
167
+ .find(([candidate]) => candidate.toLocaleLowerCase("en-US") === normalizedName);
168
+ if (!previousHeader) {
169
+ throw new AppError(400, "MCP_SECRET_REQUIRED", `MCP Server“${serverName}”的敏感 header“${name}”需要填写真实值`);
170
+ }
171
+ resolvedHeaders[name] = previousHeader[1];
172
+ }
173
+ else {
174
+ resolvedHeaders[name] = configuredValue;
175
+ }
176
+ }
177
+ normalizedServers[serverName] = {
178
+ url: endpoint.toString(),
179
+ transport: normalizedTransport(server.type ?? server.transport),
180
+ headers: resolvedHeaders
181
+ };
182
+ }
183
+ const configuration = { mcpServers: normalizedServers };
184
+ if (JSON.stringify(configurationForStorage(configuration)).length > MAXIMUM_MCP_CONFIG_CHARS) {
185
+ throw new AppError(400, "MCP_CONFIG_TOO_LARGE", "MCP 配置内容过大");
186
+ }
187
+ return configuration;
188
+ }
189
+ function modelToolName(serverName, toolName) {
190
+ const suffix = toolName
191
+ .normalize("NFKC")
192
+ .replace(/[^a-zA-Z0-9_-]+/gu, "_")
193
+ .replace(/^_+|_+$/gu, "")
194
+ .slice(0, 35) || "tool";
195
+ const digest = createHash("sha256").update(`${serverName}\0${toolName}`).digest("hex").slice(0, 12);
196
+ return `mcp_${digest}_${suffix}`.slice(0, 64);
197
+ }
198
+ function safeErrorMessage(error, server) {
199
+ let message = error instanceof Error ? error.message : "连接失败";
200
+ if (/origin does not match|cross[- ]origin/iu.test(message)) {
201
+ return "MCP Server 尝试把消息端点指向其他来源,已阻止连接";
202
+ }
203
+ for (const value of Object.values(server.headers)) {
204
+ if (value)
205
+ message = message.split(value).join(MCP_SECRET_MASK);
206
+ }
207
+ return message.replace(/[\r\n]+/gu, " ").slice(0, 300) || "连接失败";
208
+ }
209
+ function normalizedInputSchema(serverName, toolName, value) {
210
+ const schema = recordValue(value);
211
+ if (!schema || schema.type !== "object") {
212
+ throw new AppError(400, "MCP_TOOL_SCHEMA_INVALID", `MCP Server“${serverName}”的工具“${toolName}”没有有效的 object inputSchema`);
213
+ }
214
+ if (JSON.stringify(schema).length > MAXIMUM_MCP_TOOL_SCHEMA_CHARS) {
215
+ throw new AppError(400, "MCP_TOOL_SCHEMA_TOO_LARGE", `MCP Server“${serverName}”的工具“${toolName}”输入规范过大`);
216
+ }
217
+ return schema;
218
+ }
219
+ function parseCatalog(value) {
220
+ const parsed = mcpToolCatalogSchema.safeParse(value);
221
+ return parsed.success ? parsed.data : [];
222
+ }
223
+ function parseStoredCatalog(value) {
224
+ try {
225
+ return parseCatalog(JSON.parse(value));
226
+ }
227
+ catch {
228
+ return [];
229
+ }
230
+ }
231
+ export class RemoteMcpManager {
232
+ database;
233
+ vault;
234
+ fetchImpl;
235
+ validateOutboundUrl;
236
+ constructor(database, vault, fetchImpl = fetch, validateOutboundUrl) {
237
+ this.database = database;
238
+ this.vault = vault;
239
+ this.fetchImpl = fetchImpl;
240
+ this.validateOutboundUrl = validateOutboundUrl;
241
+ }
242
+ settingsRow(workId) {
243
+ return this.database.get("SELECT * FROM work_mcp_settings WHERE work_id = ?", workId);
244
+ }
245
+ decryptConfiguration(row) {
246
+ try {
247
+ const plaintext = this.vault.decrypt({
248
+ encrypted: row.config_encrypted,
249
+ iv: row.config_iv,
250
+ tag: row.config_tag
251
+ });
252
+ return parseRemoteMcpConfiguration(JSON.parse(plaintext), undefined, true);
253
+ }
254
+ catch (error) {
255
+ logger.error("mcp.configuration.decrypt_failed", {
256
+ error: error instanceof Error ? error.name : "UnknownError"
257
+ });
258
+ throw new AppError(500, "MCP_CONFIG_UNREADABLE", "当前作品的 MCP 配置无法读取,请重新保存配置");
259
+ }
260
+ }
261
+ loadConfiguration(workId) {
262
+ const row = this.settingsRow(workId);
263
+ return row ? this.decryptConfiguration(row) : { mcpServers: {} };
264
+ }
265
+ getSettings(workId) {
266
+ const row = this.settingsRow(workId);
267
+ if (!row) {
268
+ return {
269
+ config: { mcpServers: {} },
270
+ servers: [],
271
+ totalToolCount: 0,
272
+ updatedAt: null
273
+ };
274
+ }
275
+ const configuration = this.decryptConfiguration(row);
276
+ const catalog = parseStoredCatalog(row.tool_catalog_json);
277
+ return {
278
+ config: redactedConfiguration(configuration),
279
+ servers: Object.entries(configuration.mcpServers).map(([serverName, server]) => {
280
+ const tools = catalog.filter((tool) => tool.serverName === serverName);
281
+ return {
282
+ name: serverName,
283
+ url: server.url,
284
+ configuredTransport: server.transport,
285
+ transport: tools[0]?.transport ?? server.transport,
286
+ toolCount: tools.length,
287
+ serverVersion: tools[0]?.serverVersion ?? ""
288
+ };
289
+ }),
290
+ totalToolCount: catalog.length,
291
+ updatedAt: row.updated_at
292
+ };
293
+ }
294
+ secureFetch(server) {
295
+ return async (input, init) => {
296
+ const url = typeof input === "string" ? input : input.toString();
297
+ if (new URL(url).origin !== new URL(server.url).origin) {
298
+ throw new AppError(502, "MCP_CROSS_ORIGIN_REQUEST_BLOCKED", "MCP Server 尝试把请求或认证信息发送到其他来源,已阻止连接");
299
+ }
300
+ const headers = new Headers();
301
+ new Headers(init?.headers).forEach((value, name) => headers.set(name, value));
302
+ Object.entries(server.headers).forEach(([name, value]) => headers.set(name, value));
303
+ const method = init?.method ?? "GET";
304
+ const requestInit = {
305
+ ...init,
306
+ method,
307
+ headers,
308
+ body: ["GET", "HEAD"].includes(method.toUpperCase()) ? undefined : init?.body
309
+ };
310
+ return fetchSafeAiEndpoint(this.fetchImpl, url, requestInit, this.validateOutboundUrl);
311
+ };
312
+ }
313
+ async connect(server, preferredTransport, signal) {
314
+ const candidates = preferredTransport
315
+ ? [preferredTransport]
316
+ : server.transport === "auto"
317
+ ? ["streamable-http", "sse"]
318
+ : [server.transport];
319
+ let lastError;
320
+ for (const transportType of candidates) {
321
+ const client = new Client({ name: "scriverse", version: APP_VERSION }, { versionNegotiation: { mode: "auto" } });
322
+ const secureFetch = this.secureFetch(server);
323
+ const requestInit = { headers: server.headers };
324
+ const transport = transportType === "sse"
325
+ ? new SSEClientTransport(new URL(server.url), {
326
+ fetch: secureFetch,
327
+ eventSourceInit: { fetch: secureFetch },
328
+ requestInit
329
+ })
330
+ : new StreamableHTTPClientTransport(new URL(server.url), {
331
+ fetch: secureFetch,
332
+ requestInit,
333
+ reconnectionOptions: {
334
+ initialReconnectionDelay: 250,
335
+ maxReconnectionDelay: 1_000,
336
+ reconnectionDelayGrowFactor: 1.5,
337
+ maxRetries: 1
338
+ }
339
+ });
340
+ try {
341
+ await client.connect(transport, { timeout: MCP_CONNECT_TIMEOUT_MS, signal });
342
+ return { client, transport: transportType };
343
+ }
344
+ catch (error) {
345
+ lastError = error;
346
+ await client.close().catch(() => undefined);
347
+ }
348
+ }
349
+ throw lastError instanceof Error ? lastError : new Error("MCP connection failed");
350
+ }
351
+ async discoverServerTools(serverName, server) {
352
+ if (this.validateOutboundUrl) {
353
+ try {
354
+ await this.validateOutboundUrl(server.url);
355
+ }
356
+ catch (error) {
357
+ throw new AppError(400, "MCP_SERVER_ENDPOINT_UNSAFE", `MCP Server“${serverName}”地址不安全:${safeErrorMessage(error, server)}`);
358
+ }
359
+ }
360
+ let connected;
361
+ try {
362
+ connected = await this.connect(server);
363
+ }
364
+ catch (error) {
365
+ throw new AppError(400, "MCP_SERVER_UNREACHABLE", `MCP Server“${serverName}”无法连接或未通过 MCP 协议校验:${safeErrorMessage(error, server)}`);
366
+ }
367
+ try {
368
+ const tools = [];
369
+ let cursor;
370
+ let pageCount = 0;
371
+ do {
372
+ pageCount += 1;
373
+ if (pageCount > MAXIMUM_MCP_TOOL_PAGES) {
374
+ throw new AppError(400, "MCP_TOOL_PAGE_LIMIT_EXCEEDED", `MCP Server“${serverName}”返回了过多工具分页`);
375
+ }
376
+ const page = await connected.client.listTools(cursor ? { cursor } : undefined, { timeout: MCP_CONNECT_TIMEOUT_MS });
377
+ for (const tool of page.tools) {
378
+ if (!tool.name || tool.name.length > 300) {
379
+ throw new AppError(400, "MCP_TOOL_NAME_INVALID", `MCP Server“${serverName}”返回了无效工具名称`);
380
+ }
381
+ if (tools.length >= MAXIMUM_MCP_TOOLS_PER_SERVER) {
382
+ throw new AppError(400, "MCP_TOOL_LIMIT_EXCEEDED", `MCP Server“${serverName}”最多可暴露 ${MAXIMUM_MCP_TOOLS_PER_SERVER} 个工具`);
383
+ }
384
+ tools.push({
385
+ serverName,
386
+ serverToolName: tool.name,
387
+ modelToolName: modelToolName(serverName, tool.name),
388
+ description: String(tool.description ?? "").slice(0, 4_000),
389
+ inputSchema: normalizedInputSchema(serverName, tool.name, tool.inputSchema),
390
+ transport: connected.transport,
391
+ serverVersion: [connected.client.getServerVersion()?.name, connected.client.getServerVersion()?.version]
392
+ .filter(Boolean)
393
+ .join(" ")
394
+ .slice(0, 300)
395
+ });
396
+ }
397
+ cursor = page.nextCursor;
398
+ } while (cursor);
399
+ if (tools.length === 0) {
400
+ throw new AppError(400, "MCP_SERVER_NO_TOOLS", `MCP Server“${serverName}”连接成功,但没有提供可调用工具`);
401
+ }
402
+ return tools;
403
+ }
404
+ catch (error) {
405
+ if (error instanceof AppError)
406
+ throw error;
407
+ throw new AppError(400, "MCP_SERVER_TOOL_DISCOVERY_FAILED", `MCP Server“${serverName}”无法读取工具列表:${safeErrorMessage(error, server)}`);
408
+ }
409
+ finally {
410
+ await connected.client.close().catch(() => undefined);
411
+ }
412
+ }
413
+ async prepareSettings(workId, input) {
414
+ const previous = this.settingsRow(workId) ? this.loadConfiguration(workId) : undefined;
415
+ const configuration = parseRemoteMcpConfiguration(input, previous);
416
+ const catalog = [];
417
+ for (const [serverName, server] of Object.entries(configuration.mcpServers)) {
418
+ const discovered = await this.discoverServerTools(serverName, server);
419
+ if (catalog.length + discovered.length > MAXIMUM_MCP_TOOLS) {
420
+ throw new AppError(400, "MCP_TOOL_LIMIT_EXCEEDED", `每部作品最多可暴露 ${MAXIMUM_MCP_TOOLS} 个远程 MCP 工具`);
421
+ }
422
+ catalog.push(...discovered);
423
+ }
424
+ return { configuration, catalog };
425
+ }
426
+ persistSettings(workId, prepared, updatedAt) {
427
+ if (Object.keys(prepared.configuration.mcpServers).length === 0) {
428
+ this.database.run("DELETE FROM work_mcp_settings WHERE work_id = ?", workId);
429
+ return;
430
+ }
431
+ const encrypted = this.vault.encrypt(JSON.stringify(configurationForStorage(prepared.configuration)));
432
+ this.database.run(`INSERT INTO work_mcp_settings (
433
+ work_id, config_encrypted, config_iv, config_tag, tool_catalog_json, updated_at
434
+ ) VALUES (?, ?, ?, ?, ?, ?)
435
+ ON CONFLICT(work_id) DO UPDATE SET
436
+ config_encrypted = excluded.config_encrypted,
437
+ config_iv = excluded.config_iv,
438
+ config_tag = excluded.config_tag,
439
+ tool_catalog_json = excluded.tool_catalog_json,
440
+ updated_at = excluded.updated_at`, workId, encrypted.encrypted, encrypted.iv, encrypted.tag, JSON.stringify(prepared.catalog), updatedAt);
441
+ }
442
+ getAgentToolDefinitions(workId) {
443
+ const row = this.settingsRow(workId);
444
+ if (!row)
445
+ return [];
446
+ const catalog = parseStoredCatalog(row.tool_catalog_json);
447
+ return catalog.map((tool) => ({
448
+ type: "function",
449
+ function: {
450
+ name: tool.modelToolName,
451
+ description: [
452
+ `远程 MCP Server“${tool.serverName}”的工具“${tool.serverToolName}”。`,
453
+ tool.description
454
+ ].filter(Boolean).join(" ").slice(0, 4_000),
455
+ parameters: tool.inputSchema
456
+ }
457
+ }));
458
+ }
459
+ getAgentToolNames(workId) {
460
+ return this.getAgentToolDefinitions(workId).flatMap((definition) => {
461
+ const fn = recordValue(definition.function);
462
+ return typeof fn?.name === "string" ? [fn.name] : [];
463
+ });
464
+ }
465
+ async callTool(workId, modelToolNameValue, args, signal) {
466
+ const row = this.settingsRow(workId);
467
+ if (!row)
468
+ throw new AppError(409, "MCP_TOOL_NOT_CONFIGURED", "当前作品没有配置远程 MCP 工具");
469
+ const catalog = parseStoredCatalog(row.tool_catalog_json);
470
+ const tool = catalog.find((item) => item.modelToolName === modelToolNameValue);
471
+ if (!tool)
472
+ throw new AppError(409, "MCP_TOOL_NOT_CONFIGURED", "远程 MCP 工具已经不可用,请重新打开对话");
473
+ const configuration = this.decryptConfiguration(row);
474
+ const server = configuration.mcpServers[tool.serverName];
475
+ if (!server)
476
+ throw new AppError(409, "MCP_SERVER_NOT_CONFIGURED", "远程 MCP Server 已从作品配置中移除");
477
+ let connected;
478
+ try {
479
+ connected = await this.connect(server, tool.transport, signal);
480
+ }
481
+ catch (error) {
482
+ throw new AppError(502, "MCP_SERVER_UNREACHABLE", `MCP Server“${tool.serverName}”无法连接:${safeErrorMessage(error, server)}`);
483
+ }
484
+ try {
485
+ const result = await connected.client.callTool({ name: tool.serverToolName, arguments: args }, { timeout: MCP_TOOL_CALL_TIMEOUT_MS, signal });
486
+ return { catalog: tool, result };
487
+ }
488
+ catch (error) {
489
+ throw new AppError(502, "MCP_TOOL_CALL_FAILED", `MCP 工具“${tool.serverName}/${tool.serverToolName}”调用失败:${safeErrorMessage(error, server)}`);
490
+ }
491
+ finally {
492
+ await connected.client.close().catch(() => undefined);
493
+ }
494
+ }
495
+ }
496
+ //# sourceMappingURL=remote-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-mcp.js","sourceRoot":"","sources":["../src/remote-mcp.ts"],"names":[],"mappings":"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"}
package/dist/security.js CHANGED
@@ -239,9 +239,13 @@ function expensiveApiKind(method, path) {
239
239
  return "export";
240
240
  if (method === "GET" && /^\/api\/works\/[^/]+\/search$/u.test(path))
241
241
  return "search";
242
+ if (method === "PUT" && /^\/api\/works\/[^/]+\/ai-settings\/mcp-servers$/u.test(path))
243
+ return "ai";
242
244
  if (method !== "POST")
243
245
  return null;
244
246
  if (/^\/api\/works\/[^/]+\/(?:suggestions|chat\/stream|tasks)(?:\/|$)/u.test(path)
247
+ || /^\/api\/works\/[^/]+\/semantic-search$/u.test(path)
248
+ || /^\/api\/works\/[^/]+\/ai-settings\/semantic-search-index\/(?:sync|rebuild)$/u.test(path)
245
249
  || /^\/api\/suggestions\/[^/]+\/guard$/u.test(path)
246
250
  || /^\/api\/ai-conversations\/[^/]+\/(?:compact|context\/prepare)$/u.test(path)
247
251
  || /^\/api\/tasks\/[^/]+\/(?:run|rerun|cancel|relationship-changes\/apply|character-extraction\/apply)$/u.test(path)