@dexto/registry 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,689 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ServerRegistryService: () => ServerRegistryService,
24
+ getServerRegistry: () => getServerRegistry,
25
+ serverRegistry: () => serverRegistry
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/mcp/server-registry-data.json
30
+ var server_registry_data_default = [
31
+ {
32
+ id: "filesystem",
33
+ name: "Filesystem",
34
+ description: "Secure file operations with configurable access controls for reading and writing files",
35
+ category: "productivity",
36
+ icon: "\u{1F4C1}",
37
+ config: {
38
+ type: "stdio",
39
+ command: "npx",
40
+ args: ["-y", "@modelcontextprotocol/server-filesystem", "."],
41
+ timeout: 3e4
42
+ },
43
+ tags: ["file", "directory", "filesystem", "io"],
44
+ isOfficial: true,
45
+ isInstalled: false,
46
+ author: "Anthropic",
47
+ homepage: "https://github.com/modelcontextprotocol/servers",
48
+ matchIds: ["filesystem"]
49
+ },
50
+ {
51
+ id: "meme-mcp",
52
+ name: "Meme Generator",
53
+ description: "Create memes using Imgflip templates",
54
+ category: "creative",
55
+ icon: "\u{1F5BC}\uFE0F",
56
+ config: {
57
+ type: "stdio",
58
+ command: "npx",
59
+ args: ["-y", "meme-mcp"],
60
+ env: {
61
+ IMGFLIP_USERNAME: "",
62
+ IMGFLIP_PASSWORD: ""
63
+ },
64
+ timeout: 3e4
65
+ },
66
+ tags: ["meme", "image", "creative"],
67
+ isOfficial: false,
68
+ isInstalled: false,
69
+ requirements: { platform: "all", node: ">=18.0.0" },
70
+ author: "Community",
71
+ homepage: "https://www.npmjs.com/package/meme-mcp",
72
+ matchIds: ["meme-mcp"]
73
+ },
74
+ {
75
+ id: "product-name-scout",
76
+ name: "Product Name Scout",
77
+ description: "SERP analysis, autocomplete, dev collisions, and scoring for product names",
78
+ category: "research",
79
+ icon: "\u{1F50E}",
80
+ config: {
81
+ type: "stdio",
82
+ command: "npx",
83
+ args: ["-y", "@truffle-ai/product-name-scout-mcp"],
84
+ timeout: 3e4
85
+ },
86
+ tags: ["research", "naming", "brand"],
87
+ isOfficial: true,
88
+ isInstalled: false,
89
+ requirements: { platform: "all", node: ">=18.0.0" },
90
+ author: "Truffle AI",
91
+ homepage: "https://github.com/truffle-ai/mcp-servers",
92
+ matchIds: ["product-name-scout"]
93
+ },
94
+ {
95
+ id: "duckduckgo",
96
+ name: "DuckDuckGo Search",
97
+ description: "Search the web using DuckDuckGo",
98
+ category: "research",
99
+ icon: "\u{1F986}",
100
+ config: {
101
+ type: "stdio",
102
+ command: "uvx",
103
+ args: ["duckduckgo-mcp-server"],
104
+ timeout: 3e4
105
+ },
106
+ tags: ["search", "web", "research"],
107
+ isOfficial: false,
108
+ isInstalled: false,
109
+ requirements: { platform: "all", python: ">=3.10", dependencies: ["uv"] },
110
+ author: "Community",
111
+ homepage: "https://github.com/duckduckgo/mcp-server",
112
+ matchIds: ["duckduckgo", "ddg"]
113
+ },
114
+ {
115
+ id: "domain-checker",
116
+ name: "Domain Checker",
117
+ description: "Check domain availability across TLDs",
118
+ category: "research",
119
+ icon: "\u{1F310}",
120
+ config: {
121
+ type: "stdio",
122
+ command: "uvx",
123
+ args: ["truffle-ai-domain-checker-mcp"],
124
+ timeout: 3e4
125
+ },
126
+ tags: ["domains", "availability", "research"],
127
+ isOfficial: true,
128
+ isInstalled: false,
129
+ requirements: { platform: "all", python: ">=3.10" },
130
+ author: "Truffle AI",
131
+ homepage: "https://github.com/truffle-ai/mcp-servers",
132
+ matchIds: ["domain-checker"]
133
+ },
134
+ {
135
+ id: "linear",
136
+ name: "Linear",
137
+ description: "Manage Linear issues, projects, and workflows",
138
+ category: "productivity",
139
+ icon: "\u{1F4CB}",
140
+ config: {
141
+ type: "stdio",
142
+ command: "npx",
143
+ args: ["-y", "mcp-remote", "https://mcp.linear.app/sse"],
144
+ timeout: 3e4
145
+ },
146
+ tags: ["linear", "tasks", "projects"],
147
+ isOfficial: true,
148
+ isInstalled: false,
149
+ requirements: { platform: "all", node: ">=18.0.0" },
150
+ author: "Linear",
151
+ homepage: "https://mcp.linear.app",
152
+ matchIds: ["linear"]
153
+ },
154
+ {
155
+ id: "image-editor",
156
+ name: "Image Editor",
157
+ description: "Comprehensive image processing and manipulation tools",
158
+ category: "creative",
159
+ icon: "\u{1F58C}\uFE0F",
160
+ config: {
161
+ type: "stdio",
162
+ command: "uvx",
163
+ args: ["truffle-ai-image-editor-mcp"],
164
+ timeout: 3e4
165
+ },
166
+ tags: ["image", "edit", "opencv", "pillow"],
167
+ isOfficial: true,
168
+ isInstalled: false,
169
+ requirements: { platform: "all", python: ">=3.10" },
170
+ author: "Truffle AI",
171
+ homepage: "https://github.com/truffle-ai/mcp-servers",
172
+ matchIds: ["image_editor", "image-editor"]
173
+ },
174
+ {
175
+ id: "music-creator",
176
+ name: "Music Creator",
177
+ description: "Create, analyze, and transform music and audio",
178
+ category: "creative",
179
+ icon: "\u{1F3B5}",
180
+ config: {
181
+ type: "stdio",
182
+ command: "uvx",
183
+ args: ["truffle-ai-music-creator-mcp"],
184
+ timeout: 3e4
185
+ },
186
+ tags: ["audio", "music", "effects"],
187
+ isOfficial: true,
188
+ isInstalled: false,
189
+ requirements: { platform: "all", python: ">=3.10" },
190
+ author: "Truffle AI",
191
+ homepage: "https://github.com/truffle-ai/mcp-servers",
192
+ matchIds: ["music_creator", "music-creator"]
193
+ },
194
+ {
195
+ id: "elevenlabs",
196
+ name: "ElevenLabs",
197
+ description: "Text-to-speech and voice synthesis using ElevenLabs API",
198
+ category: "creative",
199
+ icon: "\u{1F3A4}",
200
+ config: {
201
+ type: "stdio",
202
+ command: "uvx",
203
+ args: ["elevenlabs-mcp"],
204
+ env: {
205
+ ELEVENLABS_API_KEY: ""
206
+ },
207
+ timeout: 3e4
208
+ },
209
+ tags: ["tts", "voice", "audio", "synthesis"],
210
+ isOfficial: true,
211
+ isInstalled: false,
212
+ requirements: { platform: "all", python: ">=3.10" },
213
+ author: "ElevenLabs",
214
+ homepage: "https://github.com/elevenlabs/elevenlabs-mcp",
215
+ matchIds: ["elevenlabs"]
216
+ },
217
+ {
218
+ id: "hf",
219
+ name: "Hugging Face",
220
+ description: "Access Hugging Face models and datasets",
221
+ category: "development",
222
+ icon: "\u{1F917}",
223
+ config: {
224
+ type: "stdio",
225
+ command: "npx",
226
+ args: ["-y", "@llmindset/mcp-hfspace"],
227
+ timeout: 3e4
228
+ },
229
+ tags: ["huggingface", "models", "ai", "ml"],
230
+ isOfficial: false,
231
+ isInstalled: false,
232
+ requirements: { platform: "all", node: ">=18.0.0" },
233
+ author: "LLMindset",
234
+ homepage: "https://github.com/llmindset/mcp-hfspace",
235
+ matchIds: ["hf", "huggingface"]
236
+ },
237
+ {
238
+ id: "tavily",
239
+ name: "Tavily Search",
240
+ description: "Web search and research using Tavily AI search engine",
241
+ category: "research",
242
+ icon: "\u{1F50D}",
243
+ config: {
244
+ type: "stdio",
245
+ command: "npx",
246
+ args: ["-y", "tavily-mcp@0.1.3"],
247
+ env: {
248
+ TAVILY_API_KEY: ""
249
+ },
250
+ timeout: 3e4
251
+ },
252
+ tags: ["search", "web", "research", "ai"],
253
+ isOfficial: false,
254
+ isInstalled: false,
255
+ requirements: { platform: "all", node: ">=18.0.0" },
256
+ author: "Tavily AI",
257
+ homepage: "https://www.npmjs.com/package/tavily-mcp",
258
+ matchIds: ["tavily"]
259
+ },
260
+ {
261
+ id: "puppeteer",
262
+ name: "Puppeteer",
263
+ description: "Browser automation and web interaction tools",
264
+ category: "productivity",
265
+ icon: "\u{1F310}",
266
+ config: {
267
+ type: "stdio",
268
+ command: "npx",
269
+ args: ["-y", "@truffle-ai/puppeteer-server"],
270
+ timeout: 3e4
271
+ },
272
+ tags: ["browser", "automation", "web", "puppeteer"],
273
+ isOfficial: true,
274
+ isInstalled: false,
275
+ requirements: { platform: "all", node: ">=18.0.0" },
276
+ author: "Truffle AI",
277
+ homepage: "https://github.com/truffle-ai/mcp-servers",
278
+ matchIds: ["puppeteer"]
279
+ },
280
+ {
281
+ id: "gemini-tts",
282
+ name: "Gemini TTS",
283
+ description: "Google Gemini Text-to-Speech with 30 prebuilt voices and multi-speaker conversation support",
284
+ category: "creative",
285
+ icon: "\u{1F399}\uFE0F",
286
+ config: {
287
+ type: "stdio",
288
+ command: "npx",
289
+ args: ["-y", "@truffle-ai/gemini-tts-server"],
290
+ env: {
291
+ GEMINI_API_KEY: ""
292
+ },
293
+ timeout: 6e4
294
+ },
295
+ tags: ["tts", "speech", "voice", "audio", "gemini", "multi-speaker"],
296
+ isOfficial: true,
297
+ isInstalled: false,
298
+ requirements: { platform: "all", node: ">=18.0.0" },
299
+ author: "Truffle AI",
300
+ homepage: "https://github.com/truffle-ai/mcp-servers",
301
+ matchIds: ["gemini-tts", "gemini_tts"]
302
+ },
303
+ {
304
+ id: "nano-banana",
305
+ name: "Nano Banana",
306
+ description: "Google Gemini 2.5 Flash Image for advanced image generation, editing, and manipulation",
307
+ category: "creative",
308
+ icon: "\u{1F34C}",
309
+ config: {
310
+ type: "stdio",
311
+ command: "npx",
312
+ args: ["-y", "@truffle-ai/nano-banana-server@0.1.2"],
313
+ env: {
314
+ GEMINI_API_KEY: ""
315
+ },
316
+ timeout: 6e4
317
+ },
318
+ tags: ["image", "generation", "editing", "ai", "gemini", "nano-banana"],
319
+ isOfficial: true,
320
+ isInstalled: false,
321
+ requirements: { platform: "all", node: ">=18.0.0" },
322
+ author: "Truffle AI",
323
+ homepage: "https://github.com/truffle-ai/mcp-servers",
324
+ matchIds: ["nano-banana", "nano_banana"]
325
+ },
326
+ {
327
+ id: "heygen",
328
+ name: "HeyGen",
329
+ description: "Generate realistic human-like audio using HeyGen",
330
+ category: "creative",
331
+ icon: "\u{1F3A4}",
332
+ config: {
333
+ type: "stdio",
334
+ command: "uvx",
335
+ args: ["heygen-mcp"],
336
+ env: {
337
+ HEYGEN_API_KEY: ""
338
+ },
339
+ timeout: 3e4
340
+ },
341
+ tags: ["audio", "voice", "synthesis", "heygen"],
342
+ isOfficial: true,
343
+ isInstalled: false,
344
+ requirements: { platform: "all", python: ">=3.10" },
345
+ author: "HeyGen",
346
+ homepage: "https://github.com/heygen-com/heygen-mcp",
347
+ matchIds: ["heygen"]
348
+ },
349
+ {
350
+ id: "runway",
351
+ name: "Runway",
352
+ description: "AI-powered creative suite for video and image generation",
353
+ category: "creative",
354
+ icon: "\u{1F3AC}",
355
+ config: {
356
+ type: "stdio",
357
+ command: "npx",
358
+ args: [
359
+ "mcp-remote",
360
+ "https://mcp.runway.team",
361
+ "--header",
362
+ "Authorization: Bearer ${RUNWAY_API_KEY}"
363
+ ],
364
+ env: {
365
+ RUNWAY_API_KEY: ""
366
+ },
367
+ timeout: 6e4
368
+ },
369
+ tags: ["runway", "video", "generation", "ai", "creative"],
370
+ isOfficial: true,
371
+ isInstalled: false,
372
+ requirements: { platform: "all", node: ">=18.0.0" },
373
+ author: "Runway",
374
+ homepage: "https://docs.runway.team/api/runway-mcp-server",
375
+ matchIds: ["runway"]
376
+ },
377
+ {
378
+ id: "perplexity",
379
+ name: "Perplexity",
380
+ description: "AI-powered search engine for real-time web search and research",
381
+ category: "research",
382
+ icon: "\u{1F50D}",
383
+ config: {
384
+ type: "stdio",
385
+ command: "npx",
386
+ args: ["-y", "@perplexity-ai/mcp-server"],
387
+ env: {
388
+ PERPLEXITY_API_KEY: "",
389
+ PERPLEXITY_TIMEOUT_MS: "600000"
390
+ },
391
+ timeout: 6e5
392
+ },
393
+ tags: ["search", "web", "research", "ai"],
394
+ isOfficial: true,
395
+ isInstalled: false,
396
+ requirements: { platform: "all", node: ">=18.0.0" },
397
+ author: "Perplexity AI",
398
+ homepage: "https://github.com/perplexityai/modelcontextprotocol/tree/main",
399
+ matchIds: ["perplexity"]
400
+ },
401
+ {
402
+ id: "sora",
403
+ name: "Sora",
404
+ description: "AI-powered video generation using OpenAI's Sora technology",
405
+ category: "creative",
406
+ icon: "\u{1F3AC}",
407
+ config: {
408
+ type: "stdio",
409
+ command: "npx",
410
+ args: ["-y", "@truffle-ai/sora-video-server"],
411
+ env: {
412
+ OPENAI_API_KEY: ""
413
+ },
414
+ timeout: 6e4
415
+ },
416
+ tags: ["video", "generation", "ai", "creative"],
417
+ isOfficial: true,
418
+ isInstalled: false,
419
+ requirements: { platform: "all", node: ">=18.0.0" },
420
+ author: "Truffle AI",
421
+ homepage: "https://github.com/truffle-ai/mcp-servers",
422
+ matchIds: ["sora", "sora_video"]
423
+ },
424
+ {
425
+ id: "chartjs",
426
+ name: "ChartJS",
427
+ description: "Charting and visualization tool using ChartJS",
428
+ category: "data",
429
+ icon: "\u{1F4CA}",
430
+ config: {
431
+ type: "stdio",
432
+ command: "npx",
433
+ args: ["-y", "@ax-crew/chartjs-mcp-server"],
434
+ timeout: 3e4
435
+ },
436
+ tags: ["chart", "visualization", "data", "chartjs"],
437
+ isOfficial: true,
438
+ isInstalled: false,
439
+ requirements: { platform: "all", node: ">=18.0.0" },
440
+ author: "ax-crew",
441
+ homepage: "https://github.com/ax-crew/chartjs-mcp-server",
442
+ matchIds: ["chartjs"]
443
+ },
444
+ {
445
+ id: "rag-lite-ts",
446
+ name: "Rag-lite TS",
447
+ description: "A local-first TypeScript retrieval engine for semantic search over static documents.",
448
+ category: "data",
449
+ icon: "\u{1F50D}",
450
+ config: {
451
+ type: "stdio",
452
+ command: "npx",
453
+ args: ["-y", "raglite-mcp"],
454
+ timeout: 3e4
455
+ },
456
+ tags: ["rag", "data", "ai"],
457
+ isOfficial: true,
458
+ isInstalled: false,
459
+ requirements: { platform: "all", node: ">=18.0.0" },
460
+ author: "FrugalX",
461
+ homepage: "https://github.com/raglite/rag-lite-ts",
462
+ matchIds: ["rag-lite-ts"]
463
+ },
464
+ {
465
+ id: "exa",
466
+ name: "Exa",
467
+ description: "AI-powered web search and research API with semantic search capabilities.",
468
+ category: "data",
469
+ icon: "\u{1F50D}",
470
+ config: {
471
+ type: "http",
472
+ url: "https://mcp.exa.ai/mcp",
473
+ headers: {}
474
+ },
475
+ tags: ["rag", "data", "ai"],
476
+ isOfficial: true,
477
+ isInstalled: false,
478
+ requirements: { platform: "all", node: ">=18.0.0" },
479
+ author: "Exa",
480
+ homepage: "https://docs.exa.ai/reference/exa-mcp",
481
+ matchIds: ["exa"]
482
+ },
483
+ {
484
+ id: "firecrawl",
485
+ name: "Firecrawl",
486
+ description: "AI-powered web search and research API that performs semantic search across web sources, aggregates and ranks results for relevance, and returns contextual summaries with citations",
487
+ category: "data",
488
+ icon: "\u{1F50D}",
489
+ config: {
490
+ type: "stdio",
491
+ command: "npx",
492
+ args: ["-y", "firecrawl-mcp"],
493
+ env: {
494
+ FIRECRAWL_API_KEY: ""
495
+ },
496
+ timeout: 3e4
497
+ },
498
+ tags: ["search", "web", "research", "ai"],
499
+ isOfficial: true,
500
+ isInstalled: false,
501
+ requirements: { platform: "all", node: ">=18.0.0" },
502
+ author: "Firecrawl",
503
+ homepage: "https://docs.firecrawl.dev/mcp-server",
504
+ matchIds: ["firecrawl"]
505
+ },
506
+ {
507
+ id: "shadcn",
508
+ name: "Shadcn",
509
+ description: "Shadcn UI components for MCP servers",
510
+ category: "development",
511
+ icon: "\u{1F58C}\uFE0F",
512
+ config: {
513
+ type: "stdio",
514
+ command: "npx",
515
+ args: ["shadcn@latest", "mcp"],
516
+ timeout: 3e4
517
+ },
518
+ tags: ["shadcn", "ui", "components", "mcp"],
519
+ isOfficial: true,
520
+ isInstalled: false,
521
+ requirements: { platform: "all", node: ">=18.0.0" },
522
+ author: "Shadcn",
523
+ homepage: "https://ui.shadcn.com/docs/mcp#configuration",
524
+ matchIds: ["shadcn"]
525
+ },
526
+ {
527
+ id: "kite-trade",
528
+ name: "Kite",
529
+ description: "Zerodha Kite API MCP server",
530
+ category: "data",
531
+ icon: "\u{1F4B0}",
532
+ config: {
533
+ type: "http",
534
+ url: "https://mcp.kite.trade/mcp",
535
+ headers: {}
536
+ },
537
+ tags: ["kite", "trade", "data", "ai"],
538
+ isOfficial: true,
539
+ isInstalled: false,
540
+ requirements: { platform: "all", node: ">=18.0.0" },
541
+ author: "Zerodha",
542
+ homepage: "https://github.com/zerodha/kite-mcp-server",
543
+ matchIds: ["kite-trade"]
544
+ },
545
+ {
546
+ id: "coingecko",
547
+ name: "CoinGecko",
548
+ description: "CoinGecko API MCP server",
549
+ category: "data",
550
+ icon: "\u{1F4B0}",
551
+ config: {
552
+ type: "http",
553
+ url: "https://mcp.api.coingecko.com/mcp",
554
+ headers: {}
555
+ },
556
+ tags: ["coingecko", "data", "ai"],
557
+ isOfficial: true,
558
+ isInstalled: false,
559
+ requirements: { platform: "all", node: ">=18.0.0" },
560
+ author: "CoinGecko",
561
+ homepage: "https://docs.coingecko.com/docs/mcp-server",
562
+ matchIds: ["coingecko"]
563
+ }
564
+ ];
565
+
566
+ // src/mcp/server-registry.ts
567
+ function normalizeId(s) {
568
+ return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
569
+ }
570
+ var ServerRegistryService = class _ServerRegistryService {
571
+ static instance;
572
+ registryEntries = [];
573
+ isInitialized = false;
574
+ constructor() {
575
+ }
576
+ static getInstance() {
577
+ if (!_ServerRegistryService.instance) {
578
+ _ServerRegistryService.instance = new _ServerRegistryService();
579
+ }
580
+ return _ServerRegistryService.instance;
581
+ }
582
+ /**
583
+ * Initialize the registry with default entries
584
+ */
585
+ async initialize() {
586
+ if (this.isInitialized) return;
587
+ this.registryEntries = server_registry_data_default;
588
+ this.isInitialized = true;
589
+ }
590
+ /**
591
+ * Get all registry entries with optional filtering
592
+ */
593
+ async getEntries(filter) {
594
+ await this.initialize();
595
+ let filtered = [...this.registryEntries];
596
+ if (filter?.category) {
597
+ filtered = filtered.filter((entry) => entry.category === filter.category);
598
+ }
599
+ if (filter?.tags?.length) {
600
+ filtered = filtered.filter(
601
+ (entry) => filter.tags.some((tag) => entry.tags.includes(tag))
602
+ );
603
+ }
604
+ if (filter?.search) {
605
+ const searchLower = filter.search.toLowerCase();
606
+ filtered = filtered.filter(
607
+ (entry) => entry.name.toLowerCase().includes(searchLower) || entry.description.toLowerCase().includes(searchLower) || entry.tags.some((tag) => tag.toLowerCase().includes(searchLower))
608
+ );
609
+ }
610
+ if (filter?.installed !== void 0) {
611
+ filtered = filtered.filter((entry) => entry.isInstalled === filter.installed);
612
+ }
613
+ if (filter?.official !== void 0) {
614
+ filtered = filtered.filter((entry) => entry.isOfficial === filter.official);
615
+ }
616
+ return filtered.sort((a, b) => {
617
+ if (a.isInstalled !== b.isInstalled) {
618
+ return a.isInstalled ? -1 : 1;
619
+ }
620
+ if (a.isOfficial !== b.isOfficial) {
621
+ return a.isOfficial ? -1 : 1;
622
+ }
623
+ return a.name.localeCompare(b.name);
624
+ });
625
+ }
626
+ /**
627
+ * Update an existing registry entry's state
628
+ */
629
+ async updateEntry(id, updates) {
630
+ await this.initialize();
631
+ const entry = this.registryEntries.find((e) => e.id === id);
632
+ if (!entry) return false;
633
+ Object.assign(entry, updates);
634
+ return true;
635
+ }
636
+ /**
637
+ * Mark a server as installed/uninstalled
638
+ */
639
+ async setInstalled(id, installed) {
640
+ return this.updateEntry(id, { isInstalled: installed });
641
+ }
642
+ /**
643
+ * Sync registry installed status with a list of connected server IDs
644
+ */
645
+ async syncInstalledStatus(connectedServerIds) {
646
+ await this.initialize();
647
+ const normalizedIds = new Set(connectedServerIds.map(normalizeId));
648
+ for (const entry of this.registryEntries) {
649
+ const aliases = [entry.id, entry.name, ...entry.matchIds || []].filter(Boolean).map((x) => normalizeId(String(x)));
650
+ const isInstalled = aliases.some((alias) => normalizedIds.has(alias));
651
+ if (entry.isInstalled !== isInstalled) {
652
+ entry.isInstalled = isInstalled;
653
+ }
654
+ }
655
+ }
656
+ /**
657
+ * Get a single server configuration by ID
658
+ */
659
+ async getServerConfig(id) {
660
+ await this.initialize();
661
+ return this.registryEntries.find((entry) => entry.id === id) || null;
662
+ }
663
+ /**
664
+ * Get all available categories
665
+ */
666
+ async getCategories() {
667
+ await this.initialize();
668
+ const categories = new Set(this.registryEntries.map((entry) => entry.category));
669
+ return Array.from(categories).sort();
670
+ }
671
+ /**
672
+ * Get all available tags
673
+ */
674
+ async getTags() {
675
+ await this.initialize();
676
+ const tags = new Set(this.registryEntries.flatMap((entry) => entry.tags));
677
+ return Array.from(tags).sort();
678
+ }
679
+ };
680
+ function getServerRegistry() {
681
+ return ServerRegistryService.getInstance();
682
+ }
683
+ var serverRegistry = ServerRegistryService.getInstance();
684
+ // Annotate the CommonJS export names for ESM import in node:
685
+ 0 && (module.exports = {
686
+ ServerRegistryService,
687
+ getServerRegistry,
688
+ serverRegistry
689
+ });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @dexto/registry
3
+ *
4
+ * Shared registry data for Dexto CLI and WebUI.
5
+ * Contains MCP server presets and future registry types.
6
+ */
7
+ export * from './mcp/index.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,gBAAgB,CAAC"}