@wundr.io/mcp-registry 1.0.12 → 1.0.15

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,394 @@
1
+ /**
2
+ * @wundr.io/mcp-registry - MCP Aggregator (Super MCP)
3
+ *
4
+ * Implements the Super MCP pattern for routing requests to appropriate
5
+ * servers based on capabilities, health, and configured routing strategies.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { EventEmitter } from 'eventemitter3';
10
+ import type { MCPServerRegistry } from './registry';
11
+ import type { ToolInvocationRequest, ToolInvocationResponse, ToolResult, AggregatorConfig, RoutingStrategy, CircuitBreakerState, CircuitBreakerStatus, MCPServerRegistration } from './types';
12
+ /**
13
+ * Error thrown when no server can handle a tool invocation
14
+ */
15
+ export declare class NoServerAvailableError extends Error {
16
+ readonly toolName: string;
17
+ constructor(toolName: string, message?: string);
18
+ }
19
+ /**
20
+ * Error thrown when a tool invocation times out
21
+ */
22
+ export declare class ToolInvocationTimeoutError extends Error {
23
+ readonly toolName: string;
24
+ readonly timeoutMs: number;
25
+ constructor(toolName: string, timeoutMs: number, message?: string);
26
+ }
27
+ /**
28
+ * Error thrown when circuit breaker is open for a server
29
+ */
30
+ export declare class CircuitBreakerOpenError extends Error {
31
+ readonly serverId: string;
32
+ constructor(serverId: string, message?: string);
33
+ }
34
+ /**
35
+ * Error thrown when all retry attempts are exhausted
36
+ */
37
+ export declare class RetryExhaustedError extends Error {
38
+ readonly toolName: string;
39
+ readonly attempts: number;
40
+ readonly lastError: Error;
41
+ constructor(toolName: string, attempts: number, lastError: Error, message?: string);
42
+ }
43
+ /**
44
+ * Error thrown when the target server has no registered transport and is not connected
45
+ */
46
+ export declare class ServerNotConnectedError extends Error {
47
+ readonly serverId: string;
48
+ readonly serverName: string;
49
+ constructor(serverId: string, serverName: string, message?: string);
50
+ }
51
+ /**
52
+ * Event map for aggregator events
53
+ */
54
+ export interface AggregatorEvents {
55
+ 'request:started': (event: RequestEvent) => void;
56
+ 'request:completed': (event: RequestEvent) => void;
57
+ 'request:failed': (event: RequestEvent) => void;
58
+ 'request:retried': (event: RequestEvent) => void;
59
+ 'circuit:opened': (event: CircuitEvent) => void;
60
+ 'circuit:closed': (event: CircuitEvent) => void;
61
+ 'circuit:half-open': (event: CircuitEvent) => void;
62
+ }
63
+ /**
64
+ * Request event data
65
+ */
66
+ export interface RequestEvent {
67
+ readonly requestId: string;
68
+ readonly toolName: string;
69
+ readonly serverId?: string;
70
+ readonly durationMs?: number;
71
+ readonly error?: Error;
72
+ readonly retryAttempt?: number;
73
+ readonly timestamp: Date;
74
+ }
75
+ /**
76
+ * Circuit breaker event data
77
+ */
78
+ export interface CircuitEvent {
79
+ readonly serverId: string;
80
+ readonly previousState: CircuitBreakerState;
81
+ readonly newState: CircuitBreakerState;
82
+ readonly timestamp: Date;
83
+ }
84
+ /**
85
+ * MCP Aggregator (Super MCP Pattern)
86
+ *
87
+ * Routes tool invocation requests to appropriate servers based on
88
+ * capabilities, health status, and configured routing strategies.
89
+ * Implements circuit breaker pattern for fault tolerance.
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const aggregator = new MCPAggregator(registry, {
94
+ * defaultStrategy: 'health-aware',
95
+ * enableRetries: true,
96
+ * maxRetries: 3,
97
+ * enableCircuitBreaker: true,
98
+ * });
99
+ *
100
+ * // Invoke a tool
101
+ * const response = await aggregator.invoke({
102
+ * name: 'drift_detection',
103
+ * arguments: { action: 'detect' },
104
+ * });
105
+ *
106
+ * // Use specific routing strategy
107
+ * const response = await aggregator.invokeWithStrategy(
108
+ * { name: 'my-tool' },
109
+ * 'least-latency',
110
+ * );
111
+ * ```
112
+ */
113
+ export declare class MCPAggregator extends EventEmitter<AggregatorEvents> {
114
+ private readonly registry;
115
+ /** Configuration */
116
+ private readonly config;
117
+ /** Discovery service */
118
+ private readonly discovery;
119
+ /** Circuit breaker states by server ID */
120
+ private readonly circuitBreakers;
121
+ /** Round-robin index by tool name */
122
+ private readonly roundRobinIndex;
123
+ /** Request counter for generating IDs */
124
+ private requestCounter;
125
+ /** Tool handler registry for direct invocation */
126
+ private readonly toolHandlers;
127
+ /** Per-server transport registry for remote dispatch */
128
+ private readonly serverTransports;
129
+ /**
130
+ * Creates a new MCPAggregator
131
+ *
132
+ * @param registry - The server registry
133
+ * @param config - Aggregator configuration
134
+ */
135
+ constructor(registry: MCPServerRegistry, config?: AggregatorConfig);
136
+ /**
137
+ * Invoke a tool using the default routing strategy
138
+ *
139
+ * @param request - Tool invocation request
140
+ * @returns Tool invocation response
141
+ * @throws {NoServerAvailableError} If no server can handle the tool
142
+ * @throws {ToolInvocationTimeoutError} If the invocation times out
143
+ * @throws {RetryExhaustedError} If all retries are exhausted
144
+ */
145
+ invoke(request: ToolInvocationRequest): Promise<ToolInvocationResponse>;
146
+ /**
147
+ * Invoke a tool with a specific routing strategy
148
+ *
149
+ * @param request - Tool invocation request
150
+ * @param strategy - Routing strategy to use
151
+ * @returns Tool invocation response
152
+ */
153
+ invokeWithStrategy(request: ToolInvocationRequest, strategy: RoutingStrategy): Promise<ToolInvocationResponse>;
154
+ /**
155
+ * Invoke multiple tools in parallel
156
+ *
157
+ * @param requests - Array of tool invocation requests
158
+ * @returns Array of tool invocation responses
159
+ */
160
+ invokeParallel(requests: readonly ToolInvocationRequest[]): Promise<readonly ToolInvocationResponse[]>;
161
+ /**
162
+ * Invoke tools in sequence
163
+ *
164
+ * @param requests - Array of tool invocation requests
165
+ * @returns Array of tool invocation responses
166
+ */
167
+ invokeSequential(requests: readonly ToolInvocationRequest[]): Promise<readonly ToolInvocationResponse[]>;
168
+ /**
169
+ * Register a direct tool handler (for local execution)
170
+ *
171
+ * @param toolName - Tool name
172
+ * @param handler - Tool handler function
173
+ */
174
+ registerToolHandler(toolName: string, handler: ToolHandler): void;
175
+ /**
176
+ * Unregister a tool handler
177
+ *
178
+ * @param toolName - Tool name
179
+ */
180
+ unregisterToolHandler(toolName: string): void;
181
+ /**
182
+ * Register a transport for a specific server to enable remote tool dispatch.
183
+ *
184
+ * The transport is responsible for forwarding the tool call to the actual
185
+ * MCP server process over whatever protocol the server uses (stdio, http, etc.).
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * aggregator.registerServerTransport(server.id, async (toolName, args) => {
190
+ * return myMcpClient.callTool(toolName, args);
191
+ * });
192
+ * ```
193
+ *
194
+ * @param serverId - Server ID as returned by registry.register()
195
+ * @param transport - Transport implementation
196
+ */
197
+ registerServerTransport(serverId: string, transport: ServerTransport): void;
198
+ /**
199
+ * Unregister a server transport
200
+ *
201
+ * @param serverId - Server ID
202
+ */
203
+ unregisterServerTransport(serverId: string): void;
204
+ /**
205
+ * Select a server for a tool using the specified strategy
206
+ *
207
+ * @param toolName - Tool name
208
+ * @param strategy - Routing strategy
209
+ * @param preferredServer - Optional preferred server ID
210
+ * @returns Selected server or undefined
211
+ */
212
+ selectServer(toolName: string, strategy: RoutingStrategy, preferredServer?: string): Promise<MCPServerRegistration | undefined>;
213
+ /**
214
+ * Select server by highest priority
215
+ */
216
+ private selectByPriority;
217
+ /**
218
+ * Select server using round-robin
219
+ */
220
+ private selectRoundRobin;
221
+ /**
222
+ * Select server with lowest latency
223
+ */
224
+ private selectByLeastLatency;
225
+ /**
226
+ * Select random server
227
+ */
228
+ private selectRandom;
229
+ /**
230
+ * Select server using health-aware strategy
231
+ */
232
+ private selectHealthAware;
233
+ /**
234
+ * Check if circuit is open for a server
235
+ *
236
+ * @param serverId - Server ID
237
+ * @returns True if circuit is open
238
+ */
239
+ isCircuitOpen(serverId: string): boolean;
240
+ /**
241
+ * Get circuit breaker status for a server
242
+ *
243
+ * @param serverId - Server ID
244
+ * @returns Circuit breaker status
245
+ */
246
+ getCircuitStatus(serverId: string): CircuitBreakerStatus;
247
+ /**
248
+ * Get all circuit breaker statuses
249
+ *
250
+ * @returns Array of circuit breaker statuses
251
+ */
252
+ getAllCircuitStatuses(): readonly CircuitBreakerStatus[];
253
+ /**
254
+ * Manually reset a circuit breaker
255
+ *
256
+ * @param serverId - Server ID
257
+ */
258
+ resetCircuit(serverId: string): void;
259
+ /**
260
+ * Manually open a circuit breaker
261
+ *
262
+ * @param serverId - Server ID
263
+ */
264
+ openCircuit(serverId: string): void;
265
+ /**
266
+ * Record a successful request
267
+ */
268
+ private recordSuccess;
269
+ /**
270
+ * Record a failed request
271
+ */
272
+ private recordFailure;
273
+ /**
274
+ * Transition circuit to a new state
275
+ */
276
+ private transitionCircuit;
277
+ /**
278
+ * Get or create circuit breaker state
279
+ */
280
+ private getOrCreateCircuitState;
281
+ /** Track last attempted server for failure recording */
282
+ private lastAttemptedServerId?;
283
+ /**
284
+ * Execute tool with timeout.
285
+ *
286
+ * Dispatch priority:
287
+ * 1. Local ToolHandler registered via registerToolHandler() - used for
288
+ * in-process tools that do not require a remote server.
289
+ * 2. ServerTransport registered via registerServerTransport() - used to
290
+ * forward the call to the actual MCP server over its native protocol.
291
+ * 3. Neither available - throw ServerNotConnectedError so the caller
292
+ * can either register a transport or handle the error explicitly.
293
+ */
294
+ private executeWithTimeout;
295
+ /**
296
+ * Execute a function with timeout
297
+ */
298
+ private executeWithTimeoutInternal;
299
+ /**
300
+ * Get the last attempted server ID
301
+ */
302
+ private getLastAttemptedServerId;
303
+ /**
304
+ * Check if a server provides a tool
305
+ */
306
+ private serverProvidesTool;
307
+ /**
308
+ * Generate a unique request ID
309
+ */
310
+ private generateRequestId;
311
+ /**
312
+ * Delay for specified milliseconds
313
+ */
314
+ private delay;
315
+ /**
316
+ * Emit a request event
317
+ */
318
+ private emitRequestEvent;
319
+ /**
320
+ * Get aggregator statistics
321
+ *
322
+ * @returns Aggregator statistics
323
+ */
324
+ getStats(): AggregatorStats;
325
+ /**
326
+ * Get the current configuration
327
+ *
328
+ * @returns Current aggregator configuration
329
+ */
330
+ getConfig(): Readonly<Required<AggregatorConfig>>;
331
+ }
332
+ /**
333
+ * Tool handler function type for in-process (local) tool execution.
334
+ */
335
+ export type ToolHandler = (args: Record<string, unknown>) => Promise<ToolResult>;
336
+ /**
337
+ * Server transport function type for remote tool dispatch.
338
+ *
339
+ * Implementors are responsible for serialising the call over the appropriate
340
+ * protocol (stdio JSON-RPC, HTTP, WebSocket, etc.) and returning a ToolResult.
341
+ *
342
+ * @param toolName - The MCP tool name to invoke
343
+ * @param args - Tool arguments
344
+ * @param server - Full server registration (transport config, metadata, etc.)
345
+ * @returns Tool result from the remote server
346
+ *
347
+ * @example
348
+ * ```typescript
349
+ * // Example using the MCP SDK Client
350
+ * const transport: ServerTransport = async (toolName, args, server) => {
351
+ * const result = await mcpClient.callTool({ name: toolName, arguments: args });
352
+ * return {
353
+ * content: result.content,
354
+ * isError: result.isError ?? false,
355
+ * serverId: server.id,
356
+ * toolName,
357
+ * };
358
+ * };
359
+ * aggregator.registerServerTransport(server.id, transport);
360
+ * ```
361
+ */
362
+ export type ServerTransport = (toolName: string, args: Record<string, unknown>, server: MCPServerRegistration) => Promise<ToolResult>;
363
+ /**
364
+ * Aggregator statistics
365
+ */
366
+ export interface AggregatorStats {
367
+ /** Number of open circuit breakers */
368
+ readonly openCircuits: number;
369
+ /** Number of half-open circuit breakers */
370
+ readonly halfOpenCircuits: number;
371
+ /** Number of closed circuit breakers */
372
+ readonly closedCircuits: number;
373
+ /** Total requests processed */
374
+ readonly totalRequests: number;
375
+ /** Number of registered direct handlers */
376
+ readonly registeredHandlers: number;
377
+ }
378
+ /**
379
+ * Create a new MCPAggregator
380
+ *
381
+ * @param registry - The server registry
382
+ * @param config - Optional aggregator configuration
383
+ * @returns New aggregator instance
384
+ *
385
+ * @example
386
+ * ```typescript
387
+ * const aggregator = createMCPAggregator(registry, {
388
+ * defaultStrategy: 'health-aware',
389
+ * enableRetries: true,
390
+ * });
391
+ * ```
392
+ */
393
+ export declare function createMCPAggregator(registry: MCPServerRegistry, config?: AggregatorConfig): MCPAggregator;
394
+ //# sourceMappingURL=aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"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"}