@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.
Files changed (77) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +280 -19
  3. package/dashboard/index.html +79 -22
  4. package/dist/auth/middleware.d.ts +21 -2
  5. package/dist/auth/middleware.d.ts.map +1 -1
  6. package/dist/auth/middleware.js +63 -13
  7. package/dist/auth/middleware.js.map +1 -1
  8. package/dist/auth/ratelimit.d.ts +16 -1
  9. package/dist/auth/ratelimit.d.ts.map +1 -1
  10. package/dist/auth/ratelimit.js +15 -8
  11. package/dist/auth/ratelimit.js.map +1 -1
  12. package/dist/auth/scopes.d.ts +40 -0
  13. package/dist/auth/scopes.d.ts.map +1 -0
  14. package/dist/auth/scopes.js +76 -0
  15. package/dist/auth/scopes.js.map +1 -0
  16. package/dist/config/loader.d.ts.map +1 -1
  17. package/dist/config/loader.js +99 -10
  18. package/dist/config/loader.js.map +1 -1
  19. package/dist/gateway/api.d.ts +30 -0
  20. package/dist/gateway/api.d.ts.map +1 -1
  21. package/dist/gateway/api.js +308 -11
  22. package/dist/gateway/api.js.map +1 -1
  23. package/dist/gateway/index.d.ts +4 -0
  24. package/dist/gateway/index.d.ts.map +1 -1
  25. package/dist/gateway/index.js +55 -2
  26. package/dist/gateway/index.js.map +1 -1
  27. package/dist/gateway/supervisor.d.ts +1 -0
  28. package/dist/gateway/supervisor.d.ts.map +1 -1
  29. package/dist/gateway/supervisor.js +12 -1
  30. package/dist/gateway/supervisor.js.map +1 -1
  31. package/dist/index.d.ts +14 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +8 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/mcp/catalog.d.ts +30 -0
  36. package/dist/mcp/catalog.d.ts.map +1 -0
  37. package/dist/mcp/catalog.js +78 -0
  38. package/dist/mcp/catalog.js.map +1 -0
  39. package/dist/mcp/endpoint.d.ts +132 -0
  40. package/dist/mcp/endpoint.d.ts.map +1 -0
  41. package/dist/mcp/endpoint.js +714 -0
  42. package/dist/mcp/endpoint.js.map +1 -0
  43. package/dist/mcp/llm-schemas.d.ts +36 -0
  44. package/dist/mcp/llm-schemas.d.ts.map +1 -0
  45. package/dist/mcp/llm-schemas.js +69 -0
  46. package/dist/mcp/llm-schemas.js.map +1 -0
  47. package/dist/mcp/naming.d.ts +53 -0
  48. package/dist/mcp/naming.d.ts.map +1 -0
  49. package/dist/mcp/naming.js +71 -0
  50. package/dist/mcp/naming.js.map +1 -0
  51. package/dist/middleware/cors.d.ts +2 -0
  52. package/dist/middleware/cors.d.ts.map +1 -1
  53. package/dist/middleware/cors.js +25 -19
  54. package/dist/middleware/cors.js.map +1 -1
  55. package/dist/monitor/audit.d.ts +60 -0
  56. package/dist/monitor/audit.d.ts.map +1 -0
  57. package/dist/monitor/audit.js +155 -0
  58. package/dist/monitor/audit.js.map +1 -0
  59. package/dist/monitor/index.d.ts +19 -0
  60. package/dist/monitor/index.d.ts.map +1 -1
  61. package/dist/monitor/index.js +88 -0
  62. package/dist/monitor/index.js.map +1 -1
  63. package/dist/proxy/index.d.ts +25 -2
  64. package/dist/proxy/index.d.ts.map +1 -1
  65. package/dist/proxy/index.js +171 -16
  66. package/dist/proxy/index.js.map +1 -1
  67. package/dist/registry/index.d.ts +16 -2
  68. package/dist/registry/index.d.ts.map +1 -1
  69. package/dist/registry/index.js +37 -1
  70. package/dist/registry/index.js.map +1 -1
  71. package/dist/utils/tool-filter.d.ts +24 -0
  72. package/dist/utils/tool-filter.d.ts.map +1 -0
  73. package/dist/utils/tool-filter.js +48 -0
  74. package/dist/utils/tool-filter.js.map +1 -0
  75. package/dist/utils/types.d.ts +116 -2
  76. package/dist/utils/types.d.ts.map +1 -1
  77. 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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"}
@@ -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;AAEzF,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;gBAElD,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,cAAmB;IAQhE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,aAAa;IAwBtE,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;IAOZ,SAAS,CAAC,KAAK,SAAM,GAAG,aAAa,EAAE;IAKvC,KAAK,IAAI,IAAI;CAId"}
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"}
@@ -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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"}
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKlF,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;AAQlC,qCAAqC;AACrC,eAAO,MAAM,qBAAqB,EAAE,cAanC,CAAC;AAqBF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,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;YA0C7C,UAAU;YAoCV,UAAU;IAgClB,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,GACf,OAAO,CAAC,aAAa,CAAC;IAkBzB,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;IAWzD,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;IAyBlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,oBAAoB;YAQd,OAAO;YAOP,YAAY;CA+E3B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"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"}
@@ -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
- return this._listTools(session);
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
- tools.push({
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, 'tools/call', { name: toolName, arguments: args }, timeout ?? session.config.timeout ?? DEFAULT_TIMEOUT_MS, true);
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(null), timeout))),
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 (!winner) {
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
- const timer = setTimeout(() => {
349
- session.pendingRequests.delete(id);
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: 'timeout' } })
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) => resolve({ ...response, durationMs: Date.now() - startTime }),
359
- reject: (err) => resolve(notConnected(err.message)),
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
- resolve(notConnected(`Request to "${serverId}" failed: ${message}`));
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([