@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.
@@ -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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"}