@winstonsayno/mcp-gateway 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -0
- package/README.md +280 -19
- package/dashboard/index.html +79 -22
- package/dist/auth/middleware.d.ts +21 -2
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +63 -13
- package/dist/auth/middleware.js.map +1 -1
- package/dist/auth/ratelimit.d.ts +16 -1
- package/dist/auth/ratelimit.d.ts.map +1 -1
- package/dist/auth/ratelimit.js +15 -8
- package/dist/auth/ratelimit.js.map +1 -1
- package/dist/auth/scopes.d.ts +40 -0
- package/dist/auth/scopes.d.ts.map +1 -0
- package/dist/auth/scopes.js +76 -0
- package/dist/auth/scopes.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +99 -10
- package/dist/config/loader.js.map +1 -1
- package/dist/gateway/api.d.ts +30 -0
- package/dist/gateway/api.d.ts.map +1 -1
- package/dist/gateway/api.js +308 -11
- package/dist/gateway/api.js.map +1 -1
- package/dist/gateway/index.d.ts +4 -0
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +55 -2
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/supervisor.d.ts +1 -0
- package/dist/gateway/supervisor.d.ts.map +1 -1
- package/dist/gateway/supervisor.js +12 -1
- package/dist/gateway/supervisor.js.map +1 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/catalog.d.ts +30 -0
- package/dist/mcp/catalog.d.ts.map +1 -0
- package/dist/mcp/catalog.js +78 -0
- package/dist/mcp/catalog.js.map +1 -0
- package/dist/mcp/endpoint.d.ts +132 -0
- package/dist/mcp/endpoint.d.ts.map +1 -0
- package/dist/mcp/endpoint.js +714 -0
- package/dist/mcp/endpoint.js.map +1 -0
- package/dist/mcp/llm-schemas.d.ts +36 -0
- package/dist/mcp/llm-schemas.d.ts.map +1 -0
- package/dist/mcp/llm-schemas.js +69 -0
- package/dist/mcp/llm-schemas.js.map +1 -0
- package/dist/mcp/naming.d.ts +53 -0
- package/dist/mcp/naming.d.ts.map +1 -0
- package/dist/mcp/naming.js +71 -0
- package/dist/mcp/naming.js.map +1 -0
- package/dist/middleware/cors.d.ts +2 -0
- package/dist/middleware/cors.d.ts.map +1 -1
- package/dist/middleware/cors.js +25 -19
- package/dist/middleware/cors.js.map +1 -1
- package/dist/monitor/audit.d.ts +60 -0
- package/dist/monitor/audit.d.ts.map +1 -0
- package/dist/monitor/audit.js +155 -0
- package/dist/monitor/audit.js.map +1 -0
- package/dist/monitor/index.d.ts +19 -0
- package/dist/monitor/index.d.ts.map +1 -1
- package/dist/monitor/index.js +88 -0
- package/dist/monitor/index.js.map +1 -1
- package/dist/proxy/index.d.ts +25 -2
- package/dist/proxy/index.d.ts.map +1 -1
- package/dist/proxy/index.js +171 -16
- package/dist/proxy/index.js.map +1 -1
- package/dist/registry/index.d.ts +16 -2
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +37 -1
- package/dist/registry/index.js.map +1 -1
- package/dist/utils/tool-filter.d.ts +24 -0
- package/dist/utils/tool-filter.d.ts.map +1 -0
- package/dist/utils/tool-filter.js +48 -0
- package/dist/utils/tool-filter.js.map +1 -0
- package/dist/utils/types.d.ts +116 -2
- package/dist/utils/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/monitor/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/monitor/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { EventEmitter } from 'events';
|
|
15
15
|
import type { RequestMetric, AggregatedMetrics, MonitorConfig } from '../utils/types.js';
|
|
16
|
+
import { type AuditPage, type AuditQuery, type AuditStore } from './audit.js';
|
|
16
17
|
export interface MetricsOptions {
|
|
17
18
|
/** Hard cap on retained request records (oldest dropped first). Default 100k. */
|
|
18
19
|
maxEntries?: number;
|
|
@@ -35,8 +36,24 @@ export declare class MetricsCollector extends EventEmitter {
|
|
|
35
36
|
private readonly maxEntries;
|
|
36
37
|
private cleanupInterval?;
|
|
37
38
|
private readonly counters;
|
|
39
|
+
private audit?;
|
|
40
|
+
private auditTimer?;
|
|
41
|
+
private auditFailures;
|
|
38
42
|
constructor(config?: MonitorConfig, options?: MetricsOptions);
|
|
39
43
|
record(metric: Omit<RequestMetric, 'id' | 'timestamp'>): RequestMetric;
|
|
44
|
+
/**
|
|
45
|
+
* Persist every record to `store` as well (history beyond the in-memory
|
|
46
|
+
* retention and across restarts). `retentionDays` > 0 prunes hourly.
|
|
47
|
+
*/
|
|
48
|
+
setAuditStore(store: AuditStore | undefined, retentionDays?: number): void;
|
|
49
|
+
getAuditStore(): AuditStore | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Query request history, newest first: the audit store when one is set,
|
|
52
|
+
* otherwise the in-memory log. Throws RangeError on an invalid cursor.
|
|
53
|
+
*/
|
|
54
|
+
queryRequests(q: AuditQuery): AuditPage & {
|
|
55
|
+
source: 'audit' | 'memory';
|
|
56
|
+
};
|
|
40
57
|
aggregate(windowMs?: number): AggregatedMetrics;
|
|
41
58
|
toPrometheusText(servers?: ServerStateSample[]): string;
|
|
42
59
|
start(): void;
|
|
@@ -44,6 +61,8 @@ export declare class MetricsCollector extends EventEmitter {
|
|
|
44
61
|
prune(now?: number): number;
|
|
45
62
|
stop(): void;
|
|
46
63
|
getRecent(limit?: number): RequestMetric[];
|
|
64
|
+
/** Newest-first records matching `pred`, at most `limit`. */
|
|
65
|
+
getRecentWhere(limit: number, pred: (m: RequestMetric) => boolean): RequestMetric[];
|
|
47
66
|
clear(): void;
|
|
48
67
|
}
|
|
49
68
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/monitor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/monitor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAgB,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAG5F,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAa;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,aAAa,CAAK;gBAEd,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,cAAmB;IAQhE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,aAAa;IAoCtE;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,aAAa,SAAI,GAAG,IAAI;IAmBrE,aAAa,IAAI,UAAU,GAAG,SAAS;IAIvC;;;OAGG;IACH,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG;QAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE;IA4BxE,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,iBAAiB;IAsD/C,gBAAgB,CAAC,OAAO,GAAE,iBAAiB,EAAO,GAAG,MAAM;IAkG3D,KAAK,IAAI,IAAI;IAMb,oDAAoD;IACpD,KAAK,CAAC,GAAG,SAAa,GAAG,MAAM;IAS/B,IAAI,IAAI,IAAI;IASZ,SAAS,CAAC,KAAK,SAAM,GAAG,aAAa,EAAE;IAKvC,6DAA6D;IAC7D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,OAAO,GAAG,aAAa,EAAE;IAQnF,KAAK,IAAI,IAAI;CAId"}
|
package/dist/monitor/index.js
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { EventEmitter } from 'events';
|
|
15
15
|
import { randomUUID } from 'crypto';
|
|
16
|
+
import { matchesQuery } from './audit.js';
|
|
17
|
+
import { logger } from '../utils/logger.js';
|
|
16
18
|
const SERVER_STATUSES = ['online', 'degraded', 'reconnecting', 'offline', 'unknown'];
|
|
17
19
|
export class MetricsCollector extends EventEmitter {
|
|
18
20
|
metrics = [];
|
|
@@ -20,6 +22,9 @@ export class MetricsCollector extends EventEmitter {
|
|
|
20
22
|
maxEntries;
|
|
21
23
|
cleanupInterval;
|
|
22
24
|
counters = new Map();
|
|
25
|
+
audit;
|
|
26
|
+
auditTimer;
|
|
27
|
+
auditFailures = 0;
|
|
23
28
|
constructor(config, options = {}) {
|
|
24
29
|
super();
|
|
25
30
|
this.retentionMs = (config?.retentionHours ?? 24) * 60 * 60 * 1000;
|
|
@@ -43,9 +48,81 @@ export class MetricsCollector extends EventEmitter {
|
|
|
43
48
|
c.errors++;
|
|
44
49
|
c.durationMsSum += metric.durationMs;
|
|
45
50
|
this.counters.set(metric.serverId, c);
|
|
51
|
+
if (this.audit) {
|
|
52
|
+
try {
|
|
53
|
+
this.audit.append(full);
|
|
54
|
+
this.auditFailures = 0;
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
// Never fail a request because the audit log is unwritable; log, but not on every call.
|
|
58
|
+
if (this.auditFailures++ % 100 === 0) {
|
|
59
|
+
logger.error(`Audit log write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
46
63
|
this.emit('metric', full);
|
|
47
64
|
return full;
|
|
48
65
|
}
|
|
66
|
+
// ─── Audit log ──────────────────────────────────────────────────────────────
|
|
67
|
+
/**
|
|
68
|
+
* Persist every record to `store` as well (history beyond the in-memory
|
|
69
|
+
* retention and across restarts). `retentionDays` > 0 prunes hourly.
|
|
70
|
+
*/
|
|
71
|
+
setAuditStore(store, retentionDays = 0) {
|
|
72
|
+
clearInterval(this.auditTimer);
|
|
73
|
+
this.auditTimer = undefined;
|
|
74
|
+
this.audit = store;
|
|
75
|
+
if (store && retentionDays > 0) {
|
|
76
|
+
const prune = () => {
|
|
77
|
+
try {
|
|
78
|
+
const n = store.prune(Date.now() - retentionDays * 86_400_000);
|
|
79
|
+
if (n > 0)
|
|
80
|
+
logger.debug(`Audit log: pruned ${n} records older than ${retentionDays} days`);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
logger.warn(`Audit log prune failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
prune();
|
|
87
|
+
this.auditTimer = setInterval(prune, 3_600_000);
|
|
88
|
+
this.auditTimer.unref();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
getAuditStore() {
|
|
92
|
+
return this.audit;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Query request history, newest first: the audit store when one is set,
|
|
96
|
+
* otherwise the in-memory log. Throws RangeError on an invalid cursor.
|
|
97
|
+
*/
|
|
98
|
+
queryRequests(q) {
|
|
99
|
+
if (this.audit)
|
|
100
|
+
return { ...this.audit.query(q), source: 'audit' };
|
|
101
|
+
let start = this.metrics.length - 1;
|
|
102
|
+
if (q.cursor !== undefined) {
|
|
103
|
+
const m = /^m(.+)$/.exec(q.cursor);
|
|
104
|
+
const idx = m ? this.metrics.findIndex((x) => x.id === m[1]) : -1;
|
|
105
|
+
if (idx < 0)
|
|
106
|
+
throw new RangeError('invalid cursor');
|
|
107
|
+
start = idx - 1;
|
|
108
|
+
}
|
|
109
|
+
const out = [];
|
|
110
|
+
let i = start;
|
|
111
|
+
for (; i >= 0 && out.length < q.limit; i--) {
|
|
112
|
+
if (matchesQuery(this.metrics[i], q))
|
|
113
|
+
out.push(this.metrics[i]);
|
|
114
|
+
}
|
|
115
|
+
// Is there anything older that matches?
|
|
116
|
+
let more = false;
|
|
117
|
+
for (let j = i; j >= 0; j--) {
|
|
118
|
+
if (matchesQuery(this.metrics[j], q)) {
|
|
119
|
+
more = true;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const last = out[out.length - 1];
|
|
124
|
+
return more && last ? { requests: out, nextCursor: `m${last.id}`, source: 'memory' } : { requests: out, source: 'memory' };
|
|
125
|
+
}
|
|
49
126
|
// ─── Aggregation ────────────────────────────────────────────────────────────
|
|
50
127
|
aggregate(windowMs) {
|
|
51
128
|
const now = Date.now();
|
|
@@ -172,6 +249,8 @@ export class MetricsCollector extends EventEmitter {
|
|
|
172
249
|
return i;
|
|
173
250
|
}
|
|
174
251
|
stop() {
|
|
252
|
+
clearInterval(this.auditTimer);
|
|
253
|
+
this.auditTimer = undefined;
|
|
175
254
|
if (this.cleanupInterval) {
|
|
176
255
|
clearInterval(this.cleanupInterval);
|
|
177
256
|
this.cleanupInterval = undefined;
|
|
@@ -182,6 +261,15 @@ export class MetricsCollector extends EventEmitter {
|
|
|
182
261
|
return [];
|
|
183
262
|
return this.metrics.slice(-Math.floor(limit)).reverse();
|
|
184
263
|
}
|
|
264
|
+
/** Newest-first records matching `pred`, at most `limit`. */
|
|
265
|
+
getRecentWhere(limit, pred) {
|
|
266
|
+
const out = [];
|
|
267
|
+
for (let i = this.metrics.length - 1; i >= 0 && out.length < limit; i--) {
|
|
268
|
+
if (pred(this.metrics[i]))
|
|
269
|
+
out.push(this.metrics[i]);
|
|
270
|
+
}
|
|
271
|
+
return out;
|
|
272
|
+
}
|
|
185
273
|
clear() {
|
|
186
274
|
this.metrics = [];
|
|
187
275
|
this.counters.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/monitor/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/monitor/index.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* (process exit, socket/stream closed, session expired). Not emitted for
|
|
18
18
|
* `disconnect()`. The gateway supervisor uses it to reconnect.
|
|
19
19
|
* - `tools-changed` (serverId, tools) — the server announced a new tool list.
|
|
20
|
+
* - `catalog-changed` (serverId, catalog) — new resource / prompt lists.
|
|
20
21
|
*
|
|
21
22
|
* Fixes kept from v0.2.0 / the audit: per-server connect mutex (BUG-001),
|
|
22
23
|
* monotonic ids (BUG-002), no leaked sessions on failed `initialize`, an old
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
* @module proxy
|
|
27
28
|
*/
|
|
28
29
|
import { EventEmitter } from 'events';
|
|
29
|
-
import type { McpServerConfig, ProxyResponse, ToolInfo } from '../utils/types.js';
|
|
30
|
+
import type { McpServerConfig, ProxyResponse, ServerCatalog, ToolInfo } from '../utils/types.js';
|
|
30
31
|
import type { ChannelFactory } from '../transport/channel.js';
|
|
31
32
|
/** Protocol version the gateway asks for in `initialize`. */
|
|
32
33
|
export declare const MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
@@ -34,11 +35,19 @@ export declare const MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
|
34
35
|
export declare const SUPPORTED_PROTOCOL_VERSIONS: string[];
|
|
35
36
|
export declare const ERR_NOT_CONNECTED = -32000;
|
|
36
37
|
export declare const ERR_TIMEOUT = -32001;
|
|
38
|
+
/** The caller cancelled the request (e.g. a downstream `notifications/cancelled`). */
|
|
39
|
+
export declare const ERR_CANCELLED = -32800;
|
|
40
|
+
export interface RequestOptions {
|
|
41
|
+
/** Abort the request: upstream gets `notifications/cancelled`, the result is `ERR_CANCELLED`. */
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
}
|
|
37
44
|
/** Default channel per transport. */
|
|
38
45
|
export declare const defaultChannelFactory: ChannelFactory;
|
|
39
46
|
export interface SessionInfo {
|
|
40
47
|
transport: string;
|
|
41
48
|
protocolVersion?: string;
|
|
49
|
+
/** Capabilities the server announced in `initialize`. */
|
|
50
|
+
capabilities?: Record<string, unknown>;
|
|
42
51
|
serverInfo?: {
|
|
43
52
|
name?: string;
|
|
44
53
|
version?: string;
|
|
@@ -60,11 +69,24 @@ export declare class McpProxy extends EventEmitter {
|
|
|
60
69
|
private getSpawnLock;
|
|
61
70
|
connect(config: McpServerConfig): Promise<ToolInfo[]>;
|
|
62
71
|
private _handshake;
|
|
72
|
+
/** Fetch every page of a list method (`resources/list`, `prompts/list`, …). */
|
|
73
|
+
private _listAll;
|
|
74
|
+
/** Resources, templates and prompts, for servers that announce those capabilities. */
|
|
75
|
+
private _listCatalog;
|
|
76
|
+
/** Whether a connected server announced a capability (e.g. "resources"). */
|
|
77
|
+
hasCapability(serverId: string, capability: string): boolean;
|
|
78
|
+
/** Resources, templates and prompts announced by a connected server. */
|
|
79
|
+
getCatalog(serverId: string): ServerCatalog;
|
|
63
80
|
private _listTools;
|
|
64
81
|
disconnect(serverId: string): Promise<void>;
|
|
65
82
|
private _disconnectUnlocked;
|
|
66
83
|
disconnectAll(): Promise<void>;
|
|
67
|
-
callTool(serverId: string, toolName: string, args: Record<string, unknown>, timeout?: number): Promise<ProxyResponse>;
|
|
84
|
+
callTool(serverId: string, toolName: string, args: Record<string, unknown>, timeout?: number, options?: RequestOptions): Promise<ProxyResponse>;
|
|
85
|
+
/**
|
|
86
|
+
* Send any MCP request to a connected server through the session layer
|
|
87
|
+
* (timeout, `maxConcurrency`, upstream cancellation).
|
|
88
|
+
*/
|
|
89
|
+
request(serverId: string, method: string, params?: unknown, timeout?: number, options?: RequestOptions): Promise<ProxyResponse>;
|
|
68
90
|
/** MCP `ping`: resolves with the round-trip latency (ms), or rejects if the server does not answer. */
|
|
69
91
|
ping(serverId: string, timeout?: number): Promise<number>;
|
|
70
92
|
isConnected(serverId: string): boolean;
|
|
@@ -79,6 +101,7 @@ export declare class McpProxy extends EventEmitter {
|
|
|
79
101
|
private _rejectAll;
|
|
80
102
|
private _onMessage;
|
|
81
103
|
private _refreshTools;
|
|
104
|
+
private _refreshCatalog;
|
|
82
105
|
private _answerServerRequest;
|
|
83
106
|
private _notify;
|
|
84
107
|
private _sendRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EACV,eAAe,EAEf,aAAa,EAGb,aAAa,EACb,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,cAAc,EAA8D,MAAM,yBAAyB,CAAC;AAM1H,6DAA6D;AAC7D,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,6EAA6E;AAC7E,eAAO,MAAM,2BAA2B,UAA6C,CAAC;AAMtF,eAAO,MAAM,iBAAiB,SAAS,CAAC;AACxC,eAAO,MAAM,WAAW,SAAS,CAAC;AAClC,sFAAsF;AACtF,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,iGAAiG;IACjG,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAQD,qCAAqC;AACrC,eAAO,MAAM,qBAAqB,EAAE,cAanC,CAAC;AAuBF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,qBAAa,QAAS,SAAQ,YAAY;IACxC,OAAO,CAAC,QAAQ,CAA8B;IAE9C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAEpC,OAAO,GAAE,YAAiB;IAMtC,OAAO,CAAC,YAAY;IAWd,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YA2C7C,UAAU;IAwCxB,+EAA+E;YACjE,QAAQ;IAmBtB,sFAAsF;YACxE,YAAY;IA2C1B,4EAA4E;IAC5E,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAK5D,wEAAwE;IACxE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa;YAK7B,UAAU;IA2ClB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAInC,mBAAmB;IAY3B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC;IAIzB;;;OAGG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC;IAmBzB,uGAAuG;IACjG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAY9D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKtC,iDAAiD;IACjD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAYzD,qEAAqE;IACrE,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAO3E,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IA8BlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,oBAAoB;YAQd,OAAO;YAOP,YAAY;CAiH3B"}
|
package/dist/proxy/index.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* (process exit, socket/stream closed, session expired). Not emitted for
|
|
18
18
|
* `disconnect()`. The gateway supervisor uses it to reconnect.
|
|
19
19
|
* - `tools-changed` (serverId, tools) — the server announced a new tool list.
|
|
20
|
+
* - `catalog-changed` (serverId, catalog) — new resource / prompt lists.
|
|
20
21
|
*
|
|
21
22
|
* Fixes kept from v0.2.0 / the audit: per-server connect mutex (BUG-001),
|
|
22
23
|
* monotonic ids (BUG-002), no leaked sessions on failed `initialize`, an old
|
|
@@ -43,6 +44,8 @@ const DEFAULT_TIMEOUT_MS = 30_000;
|
|
|
43
44
|
// JSON-RPC error codes used by the gateway
|
|
44
45
|
export const ERR_NOT_CONNECTED = -32000;
|
|
45
46
|
export const ERR_TIMEOUT = -32001;
|
|
47
|
+
/** The caller cancelled the request (e.g. a downstream `notifications/cancelled`). */
|
|
48
|
+
export const ERR_CANCELLED = -32800;
|
|
46
49
|
// ── Monotonic ID counter (fix BUG-002) ──────────────────────────────────────
|
|
47
50
|
let _idSeq = 0;
|
|
48
51
|
function nextId() {
|
|
@@ -99,6 +102,7 @@ export class McpProxy extends EventEmitter {
|
|
|
99
102
|
pendingRequests: new Map(),
|
|
100
103
|
limiter: new Semaphore(config.maxConcurrency ?? Infinity),
|
|
101
104
|
closed: false,
|
|
105
|
+
catalog: { resources: [], resourceTemplates: [], prompts: [] },
|
|
102
106
|
};
|
|
103
107
|
channel.onmessage = (msg) => this._onMessage(session, msg);
|
|
104
108
|
channel.onclose = (err) => this._onChannelLost(session, err);
|
|
@@ -134,6 +138,7 @@ export class McpProxy extends EventEmitter {
|
|
|
134
138
|
throw new Error(`Failed to initialize server "${config.id}": ${initResult.error?.message}`);
|
|
135
139
|
}
|
|
136
140
|
const init = (initResult.result ?? {});
|
|
141
|
+
session.capabilities = isPlainObject(init.capabilities) ? init.capabilities : {};
|
|
137
142
|
if (typeof init.protocolVersion === 'string') {
|
|
138
143
|
session.protocolVersion = init.protocolVersion;
|
|
139
144
|
if (!SUPPORTED_PROTOCOL_VERSIONS.includes(init.protocolVersion)) {
|
|
@@ -143,7 +148,90 @@ export class McpProxy extends EventEmitter {
|
|
|
143
148
|
}
|
|
144
149
|
session.serverInfo = init.serverInfo;
|
|
145
150
|
await this._notify(session, 'notifications/initialized');
|
|
146
|
-
|
|
151
|
+
const tools = await this._listTools(session);
|
|
152
|
+
session.catalog = await this._listCatalog(session);
|
|
153
|
+
return tools;
|
|
154
|
+
}
|
|
155
|
+
/** Fetch every page of a list method (`resources/list`, `prompts/list`, …). */
|
|
156
|
+
async _listAll(session, method, key) {
|
|
157
|
+
const timeout = session.config.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
158
|
+
const items = [];
|
|
159
|
+
let cursor;
|
|
160
|
+
for (let page = 0; page < MAX_TOOL_PAGES; page++) {
|
|
161
|
+
const r = await this._sendRequest(session, method, cursor ? { cursor } : {}, timeout, false);
|
|
162
|
+
if (!r.success) {
|
|
163
|
+
logger.warn(`Could not ${method} for "${session.config.id}": ${r.error?.message}`);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
const result = (r.result ?? {});
|
|
167
|
+
const list = result[key];
|
|
168
|
+
if (Array.isArray(list))
|
|
169
|
+
for (const it of list)
|
|
170
|
+
if (isPlainObject(it))
|
|
171
|
+
items.push(it);
|
|
172
|
+
cursor = typeof result.nextCursor === 'string' && result.nextCursor ? result.nextCursor : undefined;
|
|
173
|
+
if (!cursor)
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
return items;
|
|
177
|
+
}
|
|
178
|
+
/** Resources, templates and prompts, for servers that announce those capabilities. */
|
|
179
|
+
async _listCatalog(session) {
|
|
180
|
+
const { config } = session;
|
|
181
|
+
const caps = session.capabilities ?? {};
|
|
182
|
+
const pick = (o, keys) => {
|
|
183
|
+
const out = {};
|
|
184
|
+
for (const k of keys)
|
|
185
|
+
if (o[k] !== undefined)
|
|
186
|
+
out[k] = o[k];
|
|
187
|
+
return out;
|
|
188
|
+
};
|
|
189
|
+
const owner = { serverId: config.id, serverName: config.name };
|
|
190
|
+
const catalog = { resources: [], resourceTemplates: [], prompts: [] };
|
|
191
|
+
if (caps.resources) {
|
|
192
|
+
for (const r of await this._listAll(session, 'resources/list', 'resources')) {
|
|
193
|
+
if (typeof r.uri !== 'string')
|
|
194
|
+
continue;
|
|
195
|
+
catalog.resources.push({
|
|
196
|
+
...pick(r, ['title', 'description', 'mimeType', 'size', 'annotations']),
|
|
197
|
+
uri: r.uri,
|
|
198
|
+
name: typeof r.name === 'string' ? r.name : r.uri,
|
|
199
|
+
...owner,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
for (const t of await this._listAll(session, 'resources/templates/list', 'resourceTemplates')) {
|
|
203
|
+
if (typeof t.uriTemplate !== 'string')
|
|
204
|
+
continue;
|
|
205
|
+
catalog.resourceTemplates.push({
|
|
206
|
+
...pick(t, ['title', 'description', 'mimeType', 'annotations']),
|
|
207
|
+
uriTemplate: t.uriTemplate,
|
|
208
|
+
name: typeof t.name === 'string' ? t.name : t.uriTemplate,
|
|
209
|
+
...owner,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (caps.prompts) {
|
|
214
|
+
for (const p of await this._listAll(session, 'prompts/list', 'prompts')) {
|
|
215
|
+
if (typeof p.name !== 'string')
|
|
216
|
+
continue;
|
|
217
|
+
catalog.prompts.push({
|
|
218
|
+
...pick(p, ['title', 'description', 'arguments']),
|
|
219
|
+
name: p.name,
|
|
220
|
+
...owner,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return catalog;
|
|
225
|
+
}
|
|
226
|
+
/** Whether a connected server announced a capability (e.g. "resources"). */
|
|
227
|
+
hasCapability(serverId, capability) {
|
|
228
|
+
const s = this.sessions.get(serverId);
|
|
229
|
+
return !!s && !s.closed && !!s.capabilities?.[capability];
|
|
230
|
+
}
|
|
231
|
+
/** Resources, templates and prompts announced by a connected server. */
|
|
232
|
+
getCatalog(serverId) {
|
|
233
|
+
const s = this.sessions.get(serverId);
|
|
234
|
+
return s && !s.closed ? s.catalog : { resources: [], resourceTemplates: [], prompts: [] };
|
|
147
235
|
}
|
|
148
236
|
async _listTools(session) {
|
|
149
237
|
const { config } = session;
|
|
@@ -161,13 +249,20 @@ export class McpProxy extends EventEmitter {
|
|
|
161
249
|
const tool = t;
|
|
162
250
|
if (typeof tool?.name !== 'string')
|
|
163
251
|
continue;
|
|
164
|
-
|
|
252
|
+
const info = {
|
|
165
253
|
name: tool.name,
|
|
166
254
|
description: tool.description,
|
|
167
255
|
inputSchema: tool.inputSchema,
|
|
168
256
|
serverId: config.id,
|
|
169
257
|
serverName: config.name,
|
|
170
|
-
}
|
|
258
|
+
};
|
|
259
|
+
if (typeof tool.title === 'string')
|
|
260
|
+
info.title = tool.title;
|
|
261
|
+
if (isPlainObject(tool.outputSchema))
|
|
262
|
+
info.outputSchema = tool.outputSchema;
|
|
263
|
+
if (isPlainObject(tool.annotations))
|
|
264
|
+
info.annotations = tool.annotations;
|
|
265
|
+
tools.push(info);
|
|
171
266
|
}
|
|
172
267
|
cursor = typeof result.nextCursor === 'string' && result.nextCursor ? result.nextCursor : undefined;
|
|
173
268
|
if (!cursor)
|
|
@@ -194,7 +289,14 @@ export class McpProxy extends EventEmitter {
|
|
|
194
289
|
await Promise.all([...this.sessions.keys()].map((id) => this.disconnect(id)));
|
|
195
290
|
}
|
|
196
291
|
// ─── Tool Execution ─────────────────────────────────────────────────────────
|
|
197
|
-
async callTool(serverId, toolName, args, timeout) {
|
|
292
|
+
async callTool(serverId, toolName, args, timeout, options = {}) {
|
|
293
|
+
return this.request(serverId, 'tools/call', { name: toolName, arguments: args }, timeout, options);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Send any MCP request to a connected server through the session layer
|
|
297
|
+
* (timeout, `maxConcurrency`, upstream cancellation).
|
|
298
|
+
*/
|
|
299
|
+
async request(serverId, method, params, timeout, options = {}) {
|
|
198
300
|
const session = this.sessions.get(serverId);
|
|
199
301
|
if (!session || session.closed) {
|
|
200
302
|
return {
|
|
@@ -203,7 +305,7 @@ export class McpProxy extends EventEmitter {
|
|
|
203
305
|
durationMs: 0,
|
|
204
306
|
};
|
|
205
307
|
}
|
|
206
|
-
return this._sendRequest(session,
|
|
308
|
+
return this._sendRequest(session, method, params, timeout ?? session.config.timeout ?? DEFAULT_TIMEOUT_MS, true, options.signal);
|
|
207
309
|
}
|
|
208
310
|
/** MCP `ping`: resolves with the round-trip latency (ms), or rejects if the server does not answer. */
|
|
209
311
|
async ping(serverId, timeout = 5_000) {
|
|
@@ -230,6 +332,7 @@ export class McpProxy extends EventEmitter {
|
|
|
230
332
|
return {
|
|
231
333
|
transport: s.channel.kind,
|
|
232
334
|
protocolVersion: s.protocolVersion,
|
|
335
|
+
capabilities: s.capabilities,
|
|
233
336
|
serverInfo: s.serverInfo,
|
|
234
337
|
connectedAt: s.connectedAt,
|
|
235
338
|
};
|
|
@@ -270,6 +373,10 @@ export class McpProxy extends EventEmitter {
|
|
|
270
373
|
else if (msg.method === 'notifications/tools/list_changed') {
|
|
271
374
|
this._refreshTools(session);
|
|
272
375
|
}
|
|
376
|
+
else if (msg.method === 'notifications/resources/list_changed' ||
|
|
377
|
+
msg.method === 'notifications/prompts/list_changed') {
|
|
378
|
+
this._refreshCatalog(session);
|
|
379
|
+
}
|
|
273
380
|
return;
|
|
274
381
|
}
|
|
275
382
|
if (msg.id === undefined || msg.id === null)
|
|
@@ -294,6 +401,16 @@ export class McpProxy extends EventEmitter {
|
|
|
294
401
|
this.emit('tools-changed', session.config.id, tools);
|
|
295
402
|
}, (err) => logger.warn(`[${session.config.id}] could not refresh tools: ${String(err)}`));
|
|
296
403
|
}
|
|
404
|
+
_refreshCatalog(session) {
|
|
405
|
+
if (!session.connectedAt)
|
|
406
|
+
return;
|
|
407
|
+
void this._listCatalog(session).then((catalog) => {
|
|
408
|
+
if (session.closed)
|
|
409
|
+
return;
|
|
410
|
+
session.catalog = catalog;
|
|
411
|
+
this.emit('catalog-changed', session.config.id, catalog);
|
|
412
|
+
}, (err) => logger.warn(`[${session.config.id}] could not refresh resources/prompts: ${String(err)}`));
|
|
413
|
+
}
|
|
297
414
|
_answerServerRequest(session, id, method) {
|
|
298
415
|
const reply = method === 'ping'
|
|
299
416
|
? { jsonrpc: '2.0', id, result: {} }
|
|
@@ -306,7 +423,7 @@ export class McpProxy extends EventEmitter {
|
|
|
306
423
|
logger.debug(`[${session.config.id}] failed to send ${method}: ${String(err)}`);
|
|
307
424
|
});
|
|
308
425
|
}
|
|
309
|
-
async _sendRequest(session, method, params, timeout = DEFAULT_TIMEOUT_MS, limited = true) {
|
|
426
|
+
async _sendRequest(session, method, params, timeout = DEFAULT_TIMEOUT_MS, limited = true, signal) {
|
|
310
427
|
const serverId = session.config.id;
|
|
311
428
|
const startTime = Date.now();
|
|
312
429
|
const deadline = startTime + timeout;
|
|
@@ -320,45 +437,80 @@ export class McpProxy extends EventEmitter {
|
|
|
320
437
|
error: { code: ERR_NOT_CONNECTED, message },
|
|
321
438
|
durationMs: Date.now() - startTime,
|
|
322
439
|
});
|
|
440
|
+
const cancelled = () => ({
|
|
441
|
+
success: false,
|
|
442
|
+
error: { code: ERR_CANCELLED, message: 'Request cancelled' },
|
|
443
|
+
durationMs: Date.now() - startTime,
|
|
444
|
+
});
|
|
323
445
|
if (session.closed)
|
|
324
446
|
return notConnected(`No session for server "${serverId}"`);
|
|
447
|
+
if (signal?.aborted)
|
|
448
|
+
return cancelled();
|
|
325
449
|
// Enforce maxConcurrency; the timeout covers time spent queued.
|
|
326
450
|
let release;
|
|
327
451
|
if (limited) {
|
|
328
452
|
let queueTimer;
|
|
453
|
+
let onAbort;
|
|
329
454
|
const slot = session.limiter.acquire();
|
|
330
455
|
const winner = await Promise.race([
|
|
331
456
|
slot.then((r) => ({ release: r })),
|
|
332
|
-
new Promise((r) => (queueTimer = setTimeout(() => r(
|
|
457
|
+
new Promise((r) => (queueTimer = setTimeout(() => r('timeout'), timeout))),
|
|
458
|
+
new Promise((r) => {
|
|
459
|
+
if (!signal)
|
|
460
|
+
return;
|
|
461
|
+
onAbort = () => r('aborted');
|
|
462
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
463
|
+
}),
|
|
333
464
|
]);
|
|
334
465
|
clearTimeout(queueTimer);
|
|
335
|
-
if (
|
|
466
|
+
if (onAbort)
|
|
467
|
+
signal?.removeEventListener('abort', onAbort);
|
|
468
|
+
if (winner === 'timeout' || winner === 'aborted') {
|
|
336
469
|
// Give the slot back as soon as it is granted.
|
|
337
470
|
void slot.then((r) => r());
|
|
338
|
-
return timedOut();
|
|
471
|
+
return winner === 'timeout' ? timedOut() : cancelled();
|
|
339
472
|
}
|
|
340
473
|
release = winner.release;
|
|
341
474
|
}
|
|
342
475
|
try {
|
|
343
476
|
if (session.closed)
|
|
344
477
|
return notConnected(`Server "${serverId}" disconnected`);
|
|
478
|
+
if (signal?.aborted)
|
|
479
|
+
return cancelled();
|
|
345
480
|
return await new Promise((resolve) => {
|
|
346
481
|
const id = nextId();
|
|
347
482
|
const remaining = Math.max(0, deadline - Date.now());
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
// Ask the server to stop working on it, then free channel resources.
|
|
483
|
+
// Ask the server to stop working on it, then free channel resources.
|
|
484
|
+
const cancelUpstream = (reason) => {
|
|
351
485
|
void session.channel
|
|
352
|
-
.send({ jsonrpc: '2.0', method: 'notifications/cancelled', params: { requestId: id, reason
|
|
486
|
+
.send({ jsonrpc: '2.0', method: 'notifications/cancelled', params: { requestId: id, reason } })
|
|
353
487
|
.catch(() => { })
|
|
354
488
|
.finally(() => session.channel.abandon?.(id));
|
|
489
|
+
};
|
|
490
|
+
const onAbort = () => {
|
|
491
|
+
if (!session.pendingRequests.has(id))
|
|
492
|
+
return;
|
|
493
|
+
clearTimeout(timer);
|
|
494
|
+
session.pendingRequests.delete(id);
|
|
495
|
+
cancelUpstream('cancelled by client');
|
|
496
|
+
resolve(cancelled());
|
|
497
|
+
};
|
|
498
|
+
const settle = (response) => {
|
|
499
|
+
signal?.removeEventListener('abort', onAbort);
|
|
500
|
+
resolve(response);
|
|
501
|
+
};
|
|
502
|
+
const timer = setTimeout(() => {
|
|
503
|
+
session.pendingRequests.delete(id);
|
|
504
|
+
signal?.removeEventListener('abort', onAbort);
|
|
505
|
+
cancelUpstream('timeout');
|
|
355
506
|
resolve(timedOut());
|
|
356
507
|
}, remaining);
|
|
357
508
|
session.pendingRequests.set(id, {
|
|
358
|
-
resolve: (response) =>
|
|
359
|
-
reject: (err) =>
|
|
509
|
+
resolve: (response) => settle({ ...response, durationMs: Date.now() - startTime }),
|
|
510
|
+
reject: (err) => settle(notConnected(err.message)),
|
|
360
511
|
timer,
|
|
361
512
|
});
|
|
513
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
362
514
|
const payload = params === undefined ? { jsonrpc: '2.0', id, method } : { jsonrpc: '2.0', id, method, params };
|
|
363
515
|
session.channel.send(payload).catch((err) => {
|
|
364
516
|
const pending = session.pendingRequests.get(id);
|
|
@@ -367,7 +519,7 @@ export class McpProxy extends EventEmitter {
|
|
|
367
519
|
clearTimeout(timer);
|
|
368
520
|
session.pendingRequests.delete(id);
|
|
369
521
|
const message = err instanceof Error ? err.message : String(err);
|
|
370
|
-
|
|
522
|
+
settle(notConnected(`Request to "${serverId}" failed: ${message}`));
|
|
371
523
|
});
|
|
372
524
|
});
|
|
373
525
|
}
|
|
@@ -376,6 +528,9 @@ export class McpProxy extends EventEmitter {
|
|
|
376
528
|
}
|
|
377
529
|
}
|
|
378
530
|
}
|
|
531
|
+
function isPlainObject(v) {
|
|
532
|
+
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
533
|
+
}
|
|
379
534
|
function withTimeout(p, ms, message) {
|
|
380
535
|
let timer;
|
|
381
536
|
return Promise.race([
|