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