@wundr.io/mcp-registry 1.0.3
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/README.md +890 -0
- package/dist/aggregator.d.ts +330 -0
- package/dist/aggregator.d.ts.map +1 -0
- package/dist/aggregator.js +708 -0
- package/dist/aggregator.js.map +1 -0
- package/dist/discovery.d.ts +274 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +536 -0
- package/dist/discovery.js.map +1 -0
- package/dist/health-monitor.d.ts +304 -0
- package/dist/health-monitor.d.ts.map +1 -0
- package/dist/health-monitor.js +626 -0
- package/dist/health-monitor.js.map +1 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +185 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +323 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +647 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +663 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +120 -0
- package/dist/types.js.map +1 -0
- package/package.json +71 -0
package/dist/registry.js
ADDED
|
@@ -0,0 +1,647 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @wundr.io/mcp-registry - MCP Server Registry
|
|
4
|
+
*
|
|
5
|
+
* Core registry class for managing MCP server registrations,
|
|
6
|
+
* capability tracking, and server lifecycle management.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.MCPServerRegistry = exports.RegistrationValidationError = exports.ServerAlreadyExistsError = exports.ServerNotFoundError = void 0;
|
|
12
|
+
exports.createMCPServerRegistry = createMCPServerRegistry;
|
|
13
|
+
const eventemitter3_1 = require("eventemitter3");
|
|
14
|
+
const uuid_1 = require("uuid");
|
|
15
|
+
const types_1 = require("./types");
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Registry Error Types
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Error thrown when a server is not found in the registry
|
|
21
|
+
*/
|
|
22
|
+
class ServerNotFoundError extends Error {
|
|
23
|
+
serverId;
|
|
24
|
+
constructor(serverId, message) {
|
|
25
|
+
super(message ?? `Server not found: ${serverId}`);
|
|
26
|
+
this.serverId = serverId;
|
|
27
|
+
this.name = 'ServerNotFoundError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.ServerNotFoundError = ServerNotFoundError;
|
|
31
|
+
/**
|
|
32
|
+
* Error thrown when a server is already registered
|
|
33
|
+
*/
|
|
34
|
+
class ServerAlreadyExistsError extends Error {
|
|
35
|
+
serverName;
|
|
36
|
+
constructor(serverName, message) {
|
|
37
|
+
super(message ?? `Server already registered: ${serverName}`);
|
|
38
|
+
this.serverName = serverName;
|
|
39
|
+
this.name = 'ServerAlreadyExistsError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.ServerAlreadyExistsError = ServerAlreadyExistsError;
|
|
43
|
+
/**
|
|
44
|
+
* Error thrown when registration validation fails
|
|
45
|
+
*/
|
|
46
|
+
class RegistrationValidationError extends Error {
|
|
47
|
+
validationErrors;
|
|
48
|
+
constructor(validationErrors, message) {
|
|
49
|
+
super(message ??
|
|
50
|
+
`Registration validation failed: ${validationErrors.join(', ')}`);
|
|
51
|
+
this.validationErrors = validationErrors;
|
|
52
|
+
this.name = 'RegistrationValidationError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.RegistrationValidationError = RegistrationValidationError;
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// MCPServerRegistry Class
|
|
58
|
+
// =============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* MCP Server Registry
|
|
61
|
+
*
|
|
62
|
+
* Manages registration, discovery, and lifecycle of MCP servers.
|
|
63
|
+
* Provides event-driven notifications for registry changes.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const registry = new MCPServerRegistry();
|
|
68
|
+
*
|
|
69
|
+
* // Register a server
|
|
70
|
+
* const server = await registry.register({
|
|
71
|
+
* name: 'my-mcp-server',
|
|
72
|
+
* version: '1.0.0',
|
|
73
|
+
* transport: { type: 'stdio', command: 'node', args: ['server.js'] },
|
|
74
|
+
* });
|
|
75
|
+
*
|
|
76
|
+
* // Listen for events
|
|
77
|
+
* registry.on('server:registered', (event) => {
|
|
78
|
+
* console.log('Server registered:', event.serverId);
|
|
79
|
+
* });
|
|
80
|
+
*
|
|
81
|
+
* // Find servers by capability
|
|
82
|
+
* const servers = registry.findByCapability('tools');
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
class MCPServerRegistry extends eventemitter3_1.EventEmitter {
|
|
86
|
+
/** Registered servers by ID */
|
|
87
|
+
servers;
|
|
88
|
+
/** Server name to ID mapping for uniqueness */
|
|
89
|
+
nameToId;
|
|
90
|
+
/** Tool name to server IDs mapping */
|
|
91
|
+
toolIndex;
|
|
92
|
+
/** Tag to server IDs mapping */
|
|
93
|
+
tagIndex;
|
|
94
|
+
/** Health status by server ID */
|
|
95
|
+
healthStatuses;
|
|
96
|
+
/**
|
|
97
|
+
* Creates a new MCPServerRegistry instance
|
|
98
|
+
*/
|
|
99
|
+
constructor() {
|
|
100
|
+
super();
|
|
101
|
+
this.servers = new Map();
|
|
102
|
+
this.nameToId = new Map();
|
|
103
|
+
this.toolIndex = new Map();
|
|
104
|
+
this.tagIndex = new Map();
|
|
105
|
+
this.healthStatuses = new Map();
|
|
106
|
+
}
|
|
107
|
+
// ===========================================================================
|
|
108
|
+
// Server Registration Methods
|
|
109
|
+
// ===========================================================================
|
|
110
|
+
/**
|
|
111
|
+
* Register a new MCP server
|
|
112
|
+
*
|
|
113
|
+
* @param options - Server registration options
|
|
114
|
+
* @returns The registered server
|
|
115
|
+
* @throws {ServerAlreadyExistsError} If server name is already registered
|
|
116
|
+
* @throws {RegistrationValidationError} If options are invalid
|
|
117
|
+
*/
|
|
118
|
+
async register(options) {
|
|
119
|
+
// Validate options
|
|
120
|
+
const validation = types_1.ServerRegistrationOptionsSchema.safeParse(options);
|
|
121
|
+
if (!validation.success) {
|
|
122
|
+
const errors = validation.error.errors.map(e => `${e.path.join('.')}: ${e.message}`);
|
|
123
|
+
throw new RegistrationValidationError(errors);
|
|
124
|
+
}
|
|
125
|
+
// Check for existing server with same name
|
|
126
|
+
if (this.nameToId.has(options.name)) {
|
|
127
|
+
throw new ServerAlreadyExistsError(options.name);
|
|
128
|
+
}
|
|
129
|
+
// Create registration
|
|
130
|
+
const id = (0, uuid_1.v4)();
|
|
131
|
+
const now = new Date();
|
|
132
|
+
const registration = {
|
|
133
|
+
id,
|
|
134
|
+
name: options.name,
|
|
135
|
+
version: options.version,
|
|
136
|
+
description: options.description,
|
|
137
|
+
transport: options.transport,
|
|
138
|
+
capabilities: [],
|
|
139
|
+
tools: [],
|
|
140
|
+
resources: [],
|
|
141
|
+
prompts: [],
|
|
142
|
+
priority: options.priority ?? 0,
|
|
143
|
+
tags: options.tags ?? [],
|
|
144
|
+
registeredAt: now,
|
|
145
|
+
updatedAt: now,
|
|
146
|
+
metadata: options.metadata,
|
|
147
|
+
};
|
|
148
|
+
// Store registration
|
|
149
|
+
this.servers.set(id, registration);
|
|
150
|
+
this.nameToId.set(options.name, id);
|
|
151
|
+
// Index tags
|
|
152
|
+
if (registration.tags) {
|
|
153
|
+
for (const tag of registration.tags) {
|
|
154
|
+
this.indexTag(tag, id);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Initialize health status
|
|
158
|
+
this.healthStatuses.set(id, this.createInitialHealthStatus(id));
|
|
159
|
+
// Emit event
|
|
160
|
+
this.emitEvent('server:registered', id, { name: options.name });
|
|
161
|
+
return registration;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Unregister an MCP server
|
|
165
|
+
*
|
|
166
|
+
* @param serverId - Server ID to unregister
|
|
167
|
+
* @throws {ServerNotFoundError} If server is not found
|
|
168
|
+
*/
|
|
169
|
+
async unregister(serverId) {
|
|
170
|
+
const server = this.servers.get(serverId);
|
|
171
|
+
if (!server) {
|
|
172
|
+
throw new ServerNotFoundError(serverId);
|
|
173
|
+
}
|
|
174
|
+
// Remove from indexes
|
|
175
|
+
this.nameToId.delete(server.name);
|
|
176
|
+
// Remove tool indexes
|
|
177
|
+
for (const tool of server.tools) {
|
|
178
|
+
const serverIds = this.toolIndex.get(tool.name);
|
|
179
|
+
if (serverIds) {
|
|
180
|
+
serverIds.delete(serverId);
|
|
181
|
+
if (serverIds.size === 0) {
|
|
182
|
+
this.toolIndex.delete(tool.name);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Remove tag indexes
|
|
187
|
+
if (server.tags) {
|
|
188
|
+
for (const tag of server.tags) {
|
|
189
|
+
const serverIds = this.tagIndex.get(tag);
|
|
190
|
+
if (serverIds) {
|
|
191
|
+
serverIds.delete(serverId);
|
|
192
|
+
if (serverIds.size === 0) {
|
|
193
|
+
this.tagIndex.delete(tag);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Remove health status
|
|
199
|
+
this.healthStatuses.delete(serverId);
|
|
200
|
+
// Remove server
|
|
201
|
+
this.servers.delete(serverId);
|
|
202
|
+
// Emit event
|
|
203
|
+
this.emitEvent('server:unregistered', serverId, { name: server.name });
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get a server by ID
|
|
207
|
+
*
|
|
208
|
+
* @param serverId - Server ID
|
|
209
|
+
* @returns The server registration or undefined
|
|
210
|
+
*/
|
|
211
|
+
get(serverId) {
|
|
212
|
+
return this.servers.get(serverId);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get a server by name
|
|
216
|
+
*
|
|
217
|
+
* @param name - Server name
|
|
218
|
+
* @returns The server registration or undefined
|
|
219
|
+
*/
|
|
220
|
+
getByName(name) {
|
|
221
|
+
const id = this.nameToId.get(name);
|
|
222
|
+
return id ? this.servers.get(id) : undefined;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check if a server is registered
|
|
226
|
+
*
|
|
227
|
+
* @param serverId - Server ID
|
|
228
|
+
* @returns True if server is registered
|
|
229
|
+
*/
|
|
230
|
+
has(serverId) {
|
|
231
|
+
return this.servers.has(serverId);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Check if a server name is registered
|
|
235
|
+
*
|
|
236
|
+
* @param name - Server name
|
|
237
|
+
* @returns True if server name is registered
|
|
238
|
+
*/
|
|
239
|
+
hasName(name) {
|
|
240
|
+
return this.nameToId.has(name);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get all registered servers
|
|
244
|
+
*
|
|
245
|
+
* @returns Array of all registered servers
|
|
246
|
+
*/
|
|
247
|
+
getAll() {
|
|
248
|
+
return Array.from(this.servers.values());
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get the number of registered servers
|
|
252
|
+
*
|
|
253
|
+
* @returns Server count
|
|
254
|
+
*/
|
|
255
|
+
get size() {
|
|
256
|
+
return this.servers.size;
|
|
257
|
+
}
|
|
258
|
+
// ===========================================================================
|
|
259
|
+
// Capability Management Methods
|
|
260
|
+
// ===========================================================================
|
|
261
|
+
/**
|
|
262
|
+
* Update server capabilities
|
|
263
|
+
*
|
|
264
|
+
* @param serverId - Server ID
|
|
265
|
+
* @param capabilities - New capabilities
|
|
266
|
+
* @throws {ServerNotFoundError} If server is not found
|
|
267
|
+
*/
|
|
268
|
+
async updateCapabilities(serverId, capabilities) {
|
|
269
|
+
const server = this.servers.get(serverId);
|
|
270
|
+
if (!server) {
|
|
271
|
+
throw new ServerNotFoundError(serverId);
|
|
272
|
+
}
|
|
273
|
+
const updated = {
|
|
274
|
+
...server,
|
|
275
|
+
capabilities,
|
|
276
|
+
updatedAt: new Date(),
|
|
277
|
+
};
|
|
278
|
+
this.servers.set(serverId, updated);
|
|
279
|
+
this.emitEvent('capability:changed', serverId, { capabilities });
|
|
280
|
+
return updated;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Update server tools
|
|
284
|
+
*
|
|
285
|
+
* @param serverId - Server ID
|
|
286
|
+
* @param tools - New tools
|
|
287
|
+
* @throws {ServerNotFoundError} If server is not found
|
|
288
|
+
*/
|
|
289
|
+
async updateTools(serverId, tools) {
|
|
290
|
+
const server = this.servers.get(serverId);
|
|
291
|
+
if (!server) {
|
|
292
|
+
throw new ServerNotFoundError(serverId);
|
|
293
|
+
}
|
|
294
|
+
// Remove old tool indexes
|
|
295
|
+
for (const tool of server.tools) {
|
|
296
|
+
const serverIds = this.toolIndex.get(tool.name);
|
|
297
|
+
if (serverIds) {
|
|
298
|
+
serverIds.delete(serverId);
|
|
299
|
+
if (serverIds.size === 0) {
|
|
300
|
+
this.toolIndex.delete(tool.name);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Add new tool indexes
|
|
305
|
+
for (const tool of tools) {
|
|
306
|
+
this.indexTool(tool.name, serverId);
|
|
307
|
+
}
|
|
308
|
+
const updated = {
|
|
309
|
+
...server,
|
|
310
|
+
tools,
|
|
311
|
+
updatedAt: new Date(),
|
|
312
|
+
};
|
|
313
|
+
this.servers.set(serverId, updated);
|
|
314
|
+
// Emit events for added/removed tools
|
|
315
|
+
const oldToolNames = new Set(server.tools.map(t => t.name));
|
|
316
|
+
const newToolNames = new Set(tools.map(t => t.name));
|
|
317
|
+
for (const toolName of newToolNames) {
|
|
318
|
+
if (!oldToolNames.has(toolName)) {
|
|
319
|
+
this.emitEvent('tool:added', serverId, { toolName });
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
for (const toolName of oldToolNames) {
|
|
323
|
+
if (!newToolNames.has(toolName)) {
|
|
324
|
+
this.emitEvent('tool:removed', serverId, { toolName });
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return updated;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Update server resources
|
|
331
|
+
*
|
|
332
|
+
* @param serverId - Server ID
|
|
333
|
+
* @param resources - New resources
|
|
334
|
+
* @throws {ServerNotFoundError} If server is not found
|
|
335
|
+
*/
|
|
336
|
+
async updateResources(serverId, resources) {
|
|
337
|
+
const server = this.servers.get(serverId);
|
|
338
|
+
if (!server) {
|
|
339
|
+
throw new ServerNotFoundError(serverId);
|
|
340
|
+
}
|
|
341
|
+
const updated = {
|
|
342
|
+
...server,
|
|
343
|
+
resources,
|
|
344
|
+
updatedAt: new Date(),
|
|
345
|
+
};
|
|
346
|
+
this.servers.set(serverId, updated);
|
|
347
|
+
this.emitEvent('server:updated', serverId, { resources });
|
|
348
|
+
return updated;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Update server prompts
|
|
352
|
+
*
|
|
353
|
+
* @param serverId - Server ID
|
|
354
|
+
* @param prompts - New prompts
|
|
355
|
+
* @throws {ServerNotFoundError} If server is not found
|
|
356
|
+
*/
|
|
357
|
+
async updatePrompts(serverId, prompts) {
|
|
358
|
+
const server = this.servers.get(serverId);
|
|
359
|
+
if (!server) {
|
|
360
|
+
throw new ServerNotFoundError(serverId);
|
|
361
|
+
}
|
|
362
|
+
const updated = {
|
|
363
|
+
...server,
|
|
364
|
+
prompts,
|
|
365
|
+
updatedAt: new Date(),
|
|
366
|
+
};
|
|
367
|
+
this.servers.set(serverId, updated);
|
|
368
|
+
this.emitEvent('server:updated', serverId, { prompts });
|
|
369
|
+
return updated;
|
|
370
|
+
}
|
|
371
|
+
// ===========================================================================
|
|
372
|
+
// Search and Discovery Methods
|
|
373
|
+
// ===========================================================================
|
|
374
|
+
/**
|
|
375
|
+
* Find servers by capability category
|
|
376
|
+
*
|
|
377
|
+
* @param category - Capability category
|
|
378
|
+
* @returns Matching servers
|
|
379
|
+
*/
|
|
380
|
+
findByCapability(category) {
|
|
381
|
+
return Array.from(this.servers.values()).filter(server => server.capabilities.some(cap => cap.category === category && cap.enabled));
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Find servers that provide a specific tool
|
|
385
|
+
*
|
|
386
|
+
* @param toolName - Tool name
|
|
387
|
+
* @returns Matching servers
|
|
388
|
+
*/
|
|
389
|
+
findByTool(toolName) {
|
|
390
|
+
const serverIds = this.toolIndex.get(toolName);
|
|
391
|
+
if (!serverIds || serverIds.size === 0) {
|
|
392
|
+
return [];
|
|
393
|
+
}
|
|
394
|
+
return Array.from(serverIds)
|
|
395
|
+
.map(id => this.servers.get(id))
|
|
396
|
+
.filter((server) => server !== undefined);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Find servers by tag
|
|
400
|
+
*
|
|
401
|
+
* @param tag - Tag to search for
|
|
402
|
+
* @returns Matching servers
|
|
403
|
+
*/
|
|
404
|
+
findByTag(tag) {
|
|
405
|
+
const serverIds = this.tagIndex.get(tag);
|
|
406
|
+
if (!serverIds || serverIds.size === 0) {
|
|
407
|
+
return [];
|
|
408
|
+
}
|
|
409
|
+
return Array.from(serverIds)
|
|
410
|
+
.map(id => this.servers.get(id))
|
|
411
|
+
.filter((server) => server !== undefined);
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Find servers by health status
|
|
415
|
+
*
|
|
416
|
+
* @param status - Health status level
|
|
417
|
+
* @returns Matching servers
|
|
418
|
+
*/
|
|
419
|
+
findByHealthStatus(status) {
|
|
420
|
+
return Array.from(this.servers.values()).filter(server => {
|
|
421
|
+
const health = this.healthStatuses.get(server.id);
|
|
422
|
+
return health?.status === status;
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Get all available tool names across all servers
|
|
427
|
+
*
|
|
428
|
+
* @returns Set of tool names
|
|
429
|
+
*/
|
|
430
|
+
getAllToolNames() {
|
|
431
|
+
return new Set(this.toolIndex.keys());
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Get all available tags across all servers
|
|
435
|
+
*
|
|
436
|
+
* @returns Set of tags
|
|
437
|
+
*/
|
|
438
|
+
getAllTags() {
|
|
439
|
+
return new Set(this.tagIndex.keys());
|
|
440
|
+
}
|
|
441
|
+
// ===========================================================================
|
|
442
|
+
// Health Status Methods
|
|
443
|
+
// ===========================================================================
|
|
444
|
+
/**
|
|
445
|
+
* Get health status for a server
|
|
446
|
+
*
|
|
447
|
+
* @param serverId - Server ID
|
|
448
|
+
* @returns Health status or undefined
|
|
449
|
+
*/
|
|
450
|
+
getHealthStatus(serverId) {
|
|
451
|
+
return this.healthStatuses.get(serverId);
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Update health status for a server
|
|
455
|
+
*
|
|
456
|
+
* @param serverId - Server ID
|
|
457
|
+
* @param status - New health status
|
|
458
|
+
* @throws {ServerNotFoundError} If server is not found
|
|
459
|
+
*/
|
|
460
|
+
updateHealthStatus(serverId, status) {
|
|
461
|
+
if (!this.servers.has(serverId)) {
|
|
462
|
+
throw new ServerNotFoundError(serverId);
|
|
463
|
+
}
|
|
464
|
+
const current = this.healthStatuses.get(serverId);
|
|
465
|
+
const previousStatus = current?.status;
|
|
466
|
+
const updated = {
|
|
467
|
+
...this.createInitialHealthStatus(serverId),
|
|
468
|
+
...current,
|
|
469
|
+
...status,
|
|
470
|
+
serverId,
|
|
471
|
+
updatedAt: new Date(),
|
|
472
|
+
};
|
|
473
|
+
this.healthStatuses.set(serverId, updated);
|
|
474
|
+
// Emit event if status changed
|
|
475
|
+
if (previousStatus !== updated.status) {
|
|
476
|
+
this.emitEvent('server:health-changed', serverId, {
|
|
477
|
+
previousStatus,
|
|
478
|
+
newStatus: updated.status,
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Get all healthy servers
|
|
484
|
+
*
|
|
485
|
+
* @returns Array of healthy servers
|
|
486
|
+
*/
|
|
487
|
+
getHealthyServers() {
|
|
488
|
+
return this.findByHealthStatus('healthy');
|
|
489
|
+
}
|
|
490
|
+
// ===========================================================================
|
|
491
|
+
// Private Helper Methods
|
|
492
|
+
// ===========================================================================
|
|
493
|
+
/**
|
|
494
|
+
* Index a tool name to a server ID
|
|
495
|
+
*/
|
|
496
|
+
indexTool(toolName, serverId) {
|
|
497
|
+
let serverIds = this.toolIndex.get(toolName);
|
|
498
|
+
if (!serverIds) {
|
|
499
|
+
serverIds = new Set();
|
|
500
|
+
this.toolIndex.set(toolName, serverIds);
|
|
501
|
+
}
|
|
502
|
+
serverIds.add(serverId);
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Index a tag to a server ID
|
|
506
|
+
*/
|
|
507
|
+
indexTag(tag, serverId) {
|
|
508
|
+
let serverIds = this.tagIndex.get(tag);
|
|
509
|
+
if (!serverIds) {
|
|
510
|
+
serverIds = new Set();
|
|
511
|
+
this.tagIndex.set(tag, serverIds);
|
|
512
|
+
}
|
|
513
|
+
serverIds.add(serverId);
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Create initial health status for a server
|
|
517
|
+
*/
|
|
518
|
+
createInitialHealthStatus(serverId) {
|
|
519
|
+
return {
|
|
520
|
+
serverId,
|
|
521
|
+
status: 'unknown',
|
|
522
|
+
connected: false,
|
|
523
|
+
consecutiveFailures: 0,
|
|
524
|
+
totalRequests: 0,
|
|
525
|
+
successfulRequests: 0,
|
|
526
|
+
errorRate: 0,
|
|
527
|
+
checks: [],
|
|
528
|
+
updatedAt: new Date(),
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Emit a registry event
|
|
533
|
+
*/
|
|
534
|
+
emitEvent(type, serverId, data) {
|
|
535
|
+
const event = {
|
|
536
|
+
type,
|
|
537
|
+
serverId,
|
|
538
|
+
data,
|
|
539
|
+
timestamp: new Date(),
|
|
540
|
+
};
|
|
541
|
+
this.emit(type, event);
|
|
542
|
+
}
|
|
543
|
+
// ===========================================================================
|
|
544
|
+
// Utility Methods
|
|
545
|
+
// ===========================================================================
|
|
546
|
+
/**
|
|
547
|
+
* Clear all registered servers
|
|
548
|
+
*/
|
|
549
|
+
clear() {
|
|
550
|
+
this.servers.clear();
|
|
551
|
+
this.nameToId.clear();
|
|
552
|
+
this.toolIndex.clear();
|
|
553
|
+
this.tagIndex.clear();
|
|
554
|
+
this.healthStatuses.clear();
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Get registry statistics
|
|
558
|
+
*
|
|
559
|
+
* @returns Registry statistics
|
|
560
|
+
*/
|
|
561
|
+
getStats() {
|
|
562
|
+
const servers = Array.from(this.servers.values());
|
|
563
|
+
const healthStatuses = Array.from(this.healthStatuses.values());
|
|
564
|
+
return {
|
|
565
|
+
totalServers: this.servers.size,
|
|
566
|
+
totalTools: this.toolIndex.size,
|
|
567
|
+
totalTags: this.tagIndex.size,
|
|
568
|
+
healthyServers: healthStatuses.filter(h => h.status === 'healthy').length,
|
|
569
|
+
degradedServers: healthStatuses.filter(h => h.status === 'degraded')
|
|
570
|
+
.length,
|
|
571
|
+
unhealthyServers: healthStatuses.filter(h => h.status === 'unhealthy')
|
|
572
|
+
.length,
|
|
573
|
+
unknownServers: healthStatuses.filter(h => h.status === 'unknown').length,
|
|
574
|
+
serversByPriority: this.groupByPriority(servers),
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Group servers by priority
|
|
579
|
+
*/
|
|
580
|
+
groupByPriority(servers) {
|
|
581
|
+
const grouped = {};
|
|
582
|
+
for (const server of servers) {
|
|
583
|
+
const priority = server.priority ?? 0;
|
|
584
|
+
grouped[priority] = (grouped[priority] ?? 0) + 1;
|
|
585
|
+
}
|
|
586
|
+
return grouped;
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Export registry data for persistence
|
|
590
|
+
*
|
|
591
|
+
* @returns Exportable registry data
|
|
592
|
+
*/
|
|
593
|
+
export() {
|
|
594
|
+
return {
|
|
595
|
+
servers: Array.from(this.servers.values()),
|
|
596
|
+
healthStatuses: Array.from(this.healthStatuses.values()),
|
|
597
|
+
exportedAt: new Date(),
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Import registry data from persistence
|
|
602
|
+
*
|
|
603
|
+
* @param data - Registry data to import
|
|
604
|
+
*/
|
|
605
|
+
async import(data) {
|
|
606
|
+
this.clear();
|
|
607
|
+
for (const server of data.servers) {
|
|
608
|
+
this.servers.set(server.id, server);
|
|
609
|
+
this.nameToId.set(server.name, server.id);
|
|
610
|
+
// Index tools
|
|
611
|
+
for (const tool of server.tools) {
|
|
612
|
+
this.indexTool(tool.name, server.id);
|
|
613
|
+
}
|
|
614
|
+
// Index tags
|
|
615
|
+
if (server.tags) {
|
|
616
|
+
for (const tag of server.tags) {
|
|
617
|
+
this.indexTag(tag, server.id);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
// Import health statuses
|
|
622
|
+
for (const status of data.healthStatuses) {
|
|
623
|
+
if (this.servers.has(status.serverId)) {
|
|
624
|
+
this.healthStatuses.set(status.serverId, status);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
exports.MCPServerRegistry = MCPServerRegistry;
|
|
630
|
+
// =============================================================================
|
|
631
|
+
// Factory Function
|
|
632
|
+
// =============================================================================
|
|
633
|
+
/**
|
|
634
|
+
* Create a new MCPServerRegistry instance
|
|
635
|
+
*
|
|
636
|
+
* @returns New registry instance
|
|
637
|
+
*
|
|
638
|
+
* @example
|
|
639
|
+
* ```typescript
|
|
640
|
+
* const registry = createMCPServerRegistry();
|
|
641
|
+
* await registry.register({ ... });
|
|
642
|
+
* ```
|
|
643
|
+
*/
|
|
644
|
+
function createMCPServerRegistry() {
|
|
645
|
+
return new MCPServerRegistry();
|
|
646
|
+
}
|
|
647
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|