@yumdee/mcp-studio-registry 0.1.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 ADDED
@@ -0,0 +1,23 @@
1
+ # License
2
+
3
+ MIT License
4
+
5
+ Copyright (c) 2024 yumdee-Mcp-studio Contributors
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all
15
+ copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @yumdee/mcp-studio-registry
2
+
3
+ Community directory of MCP servers + CLI installer.
4
+
5
+ ## Commands
6
+
7
+ ```bash
8
+ # Discovery
9
+ mcp-studio search <keyword> # Search registry
10
+ mcp-studio list # List all servers
11
+ mcp-studio info <server-name> # Show server details
12
+
13
+ # Installation
14
+ mcp-studio add <server-name> # Install + configure
15
+ mcp-studio remove <server-name>
16
+ mcp-studio list-installed
17
+
18
+ # Development
19
+ mcp-studio inspect <server-name> # Start debugger
20
+ mcp-studio bench <server-name> # Score compliance
21
+ ```
22
+
23
+ ## Contributing a Server
24
+
25
+ 1. Create `servers/your-server-name.json`:
26
+ ```json
27
+ {
28
+ "$schema": "https://yumdee-mcp-studio.dev/schema/server-listing.json",
29
+ "name": "your-server-name",
30
+ "displayName": "Your Server",
31
+ "description": "Brief description",
32
+ "transport": "stdio",
33
+ "command": "npx your-server-name",
34
+ "tags": ["category"]
35
+ }
36
+ ```
37
+
38
+ 2. Submit a PR — CI validates schema + pings server
39
+
40
+ ## Development
41
+
42
+ See [../../CONTRIBUTING.md](../../CONTRIBUTING.md)
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { createRegistry } from "../registry.js";
3
+ import * as path from "path";
4
+ describe("ServerRegistry", () => {
5
+ it("should load server listings and enable search and filtering", async () => {
6
+ const serversDir = path.resolve(__dirname, "../../../../packages/registry/servers");
7
+ const registry = createRegistry(serversDir);
8
+ await registry.load();
9
+ const all = registry.list();
10
+ expect(all.length).toBeGreaterThanOrEqual(3);
11
+ const fsServer = registry.get("filesystem-mcp");
12
+ expect(fsServer).toBeDefined();
13
+ expect(fsServer?.displayName).toBe("Filesystem Access");
14
+ const searchResults = registry.search("postgres");
15
+ expect(searchResults.length).toBe(1);
16
+ expect(searchResults[0].name).toBe("postgres-mcp");
17
+ const tagged = registry.filterByTag("database");
18
+ expect(tagged.length).toBe(1);
19
+ });
20
+ });
21
+ //# sourceMappingURL=registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uCAAuC,CAAC,CAAC;QACpF,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAE7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAExD,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Studio CLI
4
+ *
5
+ * Entry point: npx mcp-studio
6
+ *
7
+ * Commands:
8
+ * mcp-studio search <keyword> # Search for servers
9
+ * mcp-studio list # List all available servers
10
+ * mcp-studio add <name> # Install server to Claude Desktop / Cursor
11
+ * mcp-studio validate # Validate all server listings
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
package/dist/cli.js ADDED
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Studio CLI
4
+ *
5
+ * Entry point: npx mcp-studio
6
+ *
7
+ * Commands:
8
+ * mcp-studio search <keyword> # Search for servers
9
+ * mcp-studio list # List all available servers
10
+ * mcp-studio add <name> # Install server to Claude Desktop / Cursor
11
+ * mcp-studio validate # Validate all server listings
12
+ */
13
+ import { promises as fs } from "fs";
14
+ import * as path from "path";
15
+ import * as os from "os";
16
+ import { createRegistry } from "./registry.js";
17
+ function getClaudeConfigPath() {
18
+ const platform = process.platform;
19
+ if (platform === "win32") {
20
+ const appData = process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming");
21
+ return path.join(appData, "Claude", "claude_desktop_config.json");
22
+ }
23
+ else if (platform === "darwin") {
24
+ return path.join(os.homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
25
+ }
26
+ else {
27
+ return path.join(os.homedir(), ".config", "Claude", "claude_desktop_config.json");
28
+ }
29
+ }
30
+ function getCursorConfigPath() {
31
+ return path.join(os.homedir(), ".cursor", "mcp.json");
32
+ }
33
+ async function addServerToConfig(server, targetApp = "claude") {
34
+ const configPath = targetApp === "claude" ? getClaudeConfigPath() : getCursorConfigPath();
35
+ const configDir = path.dirname(configPath);
36
+ await fs.mkdir(configDir, { recursive: true });
37
+ let config = { mcpServers: {} };
38
+ try {
39
+ const existing = await fs.readFile(configPath, "utf8");
40
+ config = JSON.parse(existing);
41
+ if (!config.mcpServers)
42
+ config.mcpServers = {};
43
+ // Backup existing configuration
44
+ await fs.writeFile(`${configPath}.bak`, existing, "utf8");
45
+ console.log(`📋 Created backup at ${configPath}.bak`);
46
+ }
47
+ catch (err) {
48
+ if (err.code !== "ENOENT") {
49
+ console.warn("⚠️ Warning: could not parse existing config, creating fresh configuration.");
50
+ }
51
+ }
52
+ // Parse command & arguments
53
+ let command = server.command || "npx";
54
+ let args = [];
55
+ if (server.command && server.command.includes(" ")) {
56
+ const parts = server.command.split(" ");
57
+ command = parts[0];
58
+ args = parts.slice(1);
59
+ }
60
+ config.mcpServers[server.name] = {
61
+ command,
62
+ args,
63
+ env: {},
64
+ };
65
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2), "utf8");
66
+ console.log(`✅ Successfully added "${server.displayName}" (${server.name}) to ${targetApp} config!`);
67
+ console.log(`📁 Config path: ${configPath}`);
68
+ }
69
+ async function main() {
70
+ const args = process.argv.slice(2);
71
+ const command = args[0];
72
+ const registry = createRegistry();
73
+ await registry.load();
74
+ switch (command) {
75
+ case "search": {
76
+ const keyword = args[1];
77
+ if (!keyword) {
78
+ console.error("Usage: mcp-studio search <keyword>");
79
+ process.exit(1);
80
+ }
81
+ const results = registry.search(keyword);
82
+ if (results.length === 0) {
83
+ console.log(`No servers found matching "${keyword}"`);
84
+ }
85
+ else {
86
+ console.log(`Found ${results.length} server(s):\n`);
87
+ results.forEach((server) => {
88
+ const verified = server.verified ? "✓ [Verified]" : "";
89
+ console.log(`📦 ${server.displayName} (${server.name}) ${verified}`);
90
+ console.log(` Description: ${server.description}`);
91
+ console.log(` Command: ${server.command || server.endpoint || "N/A"}`);
92
+ console.log(` Homepage: ${server.homepage}`);
93
+ console.log();
94
+ });
95
+ }
96
+ break;
97
+ }
98
+ case "list": {
99
+ const servers = registry.list();
100
+ console.log(`Available servers: ${servers.length}\n`);
101
+ servers.forEach((server) => {
102
+ const verified = server.verified ? "✓" : " ";
103
+ const tags = server.tags ? `[${server.tags.join(", ")}]` : "";
104
+ console.log(`[${verified}] ${server.displayName.padEnd(22)} (${server.name.padEnd(16)}) ${tags}`);
105
+ });
106
+ break;
107
+ }
108
+ case "add": {
109
+ const name = args[1];
110
+ if (!name) {
111
+ console.error("Usage: mcp-studio add <name> [--target claude|cursor]");
112
+ process.exit(1);
113
+ }
114
+ const targetFlag = args.includes("--cursor") || args.includes("cursor") ? "cursor" : "claude";
115
+ const server = registry.get(name);
116
+ if (!server) {
117
+ console.error(`Error: Server "${name}" not found in registry.`);
118
+ console.error("Run 'mcp-studio list' to see all available servers.");
119
+ process.exit(1);
120
+ }
121
+ console.log(`Installing ${server.displayName} (${server.name})...`);
122
+ await addServerToConfig(server, targetFlag);
123
+ break;
124
+ }
125
+ case "validate": {
126
+ console.log("Validating all server listings in registry...");
127
+ const servers = registry.list();
128
+ let errors = 0;
129
+ for (const server of servers) {
130
+ if (!server.name || !server.command && !server.endpoint) {
131
+ console.error(`❌ Invalid listing: ${server.name} missing command or endpoint.`);
132
+ errors++;
133
+ }
134
+ else {
135
+ console.log(`✓ ${server.name} valid (${server.transport})`);
136
+ }
137
+ }
138
+ if (errors > 0) {
139
+ console.error(`\nValidation completed with ${errors} error(s).`);
140
+ process.exit(1);
141
+ }
142
+ else {
143
+ console.log(`\nAll ${servers.length} server listings validated successfully!`);
144
+ }
145
+ break;
146
+ }
147
+ default: {
148
+ console.log("MCP Studio - Model Context Protocol toolkit");
149
+ console.log("\nUsage: mcp-studio <command> [args]\n");
150
+ console.log("Commands:");
151
+ console.log(" search <keyword> Search for servers");
152
+ console.log(" list List all servers");
153
+ console.log(" add <name> [--target cursor] Install a server into Claude Desktop / Cursor");
154
+ console.log(" validate Validate server listings");
155
+ break;
156
+ }
157
+ }
158
+ }
159
+ main().catch((err) => {
160
+ console.error("Fatal error:", err);
161
+ process.exit(1);
162
+ });
163
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @yumdee/mcp-studio-registry
3
+ *
4
+ * Community-submitted MCP server directory + CLI installer.
5
+ *
6
+ * Exports:
7
+ * - ServerRegistry class - query and manage server listings
8
+ * - ServerListing type - server definition
9
+ * - createRegistry() - factory function
10
+ */
11
+ export { ServerRegistry, createRegistry, type ServerListing } from "./registry.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @yumdee/mcp-studio-registry
3
+ *
4
+ * Community-submitted MCP server directory + CLI installer.
5
+ *
6
+ * Exports:
7
+ * - ServerRegistry class - query and manage server listings
8
+ * - ServerListing type - server definition
9
+ * - createRegistry() - factory function
10
+ */
11
+ export { ServerRegistry, createRegistry } from "./registry.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAsB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * MCP Server Registry
3
+ *
4
+ * Manages the collection of community-submitted MCP server listings.
5
+ * Listings are JSON files in servers/ directory.
6
+ */
7
+ import { z } from "zod";
8
+ export declare const ServerListingSchema: z.ZodObject<{
9
+ name: z.ZodString;
10
+ displayName: z.ZodString;
11
+ description: z.ZodString;
12
+ homepage: z.ZodString;
13
+ repository: z.ZodString;
14
+ transport: z.ZodEnum<["stdio", "sse", "http"]>;
15
+ command: z.ZodOptional<z.ZodString>;
16
+ endpoint: z.ZodOptional<z.ZodString>;
17
+ author: z.ZodObject<{
18
+ name: z.ZodString;
19
+ email: z.ZodOptional<z.ZodString>;
20
+ github: z.ZodOptional<z.ZodString>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ name: string;
23
+ email?: string | undefined;
24
+ github?: string | undefined;
25
+ }, {
26
+ name: string;
27
+ email?: string | undefined;
28
+ github?: string | undefined;
29
+ }>;
30
+ license: z.ZodString;
31
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
32
+ verified: z.ZodOptional<z.ZodBoolean>;
33
+ lastVerified: z.ZodOptional<z.ZodString>;
34
+ }, "strip", z.ZodTypeAny, {
35
+ name: string;
36
+ displayName: string;
37
+ description: string;
38
+ homepage: string;
39
+ repository: string;
40
+ transport: "stdio" | "sse" | "http";
41
+ author: {
42
+ name: string;
43
+ email?: string | undefined;
44
+ github?: string | undefined;
45
+ };
46
+ license: string;
47
+ command?: string | undefined;
48
+ endpoint?: string | undefined;
49
+ tags?: string[] | undefined;
50
+ verified?: boolean | undefined;
51
+ lastVerified?: string | undefined;
52
+ }, {
53
+ name: string;
54
+ displayName: string;
55
+ description: string;
56
+ homepage: string;
57
+ repository: string;
58
+ transport: "stdio" | "sse" | "http";
59
+ author: {
60
+ name: string;
61
+ email?: string | undefined;
62
+ github?: string | undefined;
63
+ };
64
+ license: string;
65
+ command?: string | undefined;
66
+ endpoint?: string | undefined;
67
+ tags?: string[] | undefined;
68
+ verified?: boolean | undefined;
69
+ lastVerified?: string | undefined;
70
+ }>;
71
+ export type ServerListing = z.infer<typeof ServerListingSchema>;
72
+ /**
73
+ * Registry class - loads and queries server listings
74
+ */
75
+ export declare class ServerRegistry {
76
+ private listings;
77
+ private serversDir?;
78
+ constructor(serversDir?: string);
79
+ /**
80
+ * Load listings from the registry directory
81
+ */
82
+ load(): Promise<void>;
83
+ /**
84
+ * Get a server listing by name
85
+ */
86
+ get(name: string): ServerListing | undefined;
87
+ /**
88
+ * Manually register or overwrite a server listing
89
+ */
90
+ register(listing: ServerListing): void;
91
+ /**
92
+ * Search for servers by keyword (name, displayName, description, tags)
93
+ */
94
+ search(keyword: string): ServerListing[];
95
+ /**
96
+ * List all servers
97
+ */
98
+ list(): ServerListing[];
99
+ /**
100
+ * Get servers by tag
101
+ */
102
+ filterByTag(tag: string): ServerListing[];
103
+ }
104
+ export declare function createRegistry(serversDir?: string): ServerRegistry;
105
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkB9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,UAAU,CAAC,EAAE,MAAM;IAI/B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C3B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI5C;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKtC;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE;IAWxC;;OAEG;IACH,IAAI,IAAI,aAAa,EAAE;IAIvB;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE;CAM1C;AAED,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAElE"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * MCP Server Registry
3
+ *
4
+ * Manages the collection of community-submitted MCP server listings.
5
+ * Listings are JSON files in servers/ directory.
6
+ */
7
+ import { promises as fs } from "fs";
8
+ import * as path from "path";
9
+ import { fileURLToPath } from "url";
10
+ import { z } from "zod";
11
+ export const ServerListingSchema = z.object({
12
+ name: z.string(),
13
+ displayName: z.string(),
14
+ description: z.string(),
15
+ homepage: z.string().url(),
16
+ repository: z.string().url(),
17
+ transport: z.enum(["stdio", "sse", "http"]),
18
+ command: z.string().optional(),
19
+ endpoint: z.string().optional(),
20
+ author: z.object({
21
+ name: z.string(),
22
+ email: z.string().email().optional(),
23
+ github: z.string().optional(),
24
+ }),
25
+ license: z.string(),
26
+ tags: z.array(z.string()).optional(),
27
+ verified: z.boolean().optional(),
28
+ lastVerified: z.string().datetime().optional(),
29
+ });
30
+ /**
31
+ * Registry class - loads and queries server listings
32
+ */
33
+ export class ServerRegistry {
34
+ constructor(serversDir) {
35
+ this.listings = new Map();
36
+ this.serversDir = serversDir;
37
+ }
38
+ /**
39
+ * Load listings from the registry directory
40
+ */
41
+ async load() {
42
+ const candidates = [];
43
+ if (this.serversDir) {
44
+ candidates.push(path.resolve(this.serversDir));
45
+ }
46
+ // Resolve relative to module location
47
+ try {
48
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
49
+ candidates.push(path.resolve(currentDir, "../servers"));
50
+ candidates.push(path.resolve(currentDir, "../../servers"));
51
+ candidates.push(path.resolve(process.cwd(), "packages/registry/servers"));
52
+ candidates.push(path.resolve(process.cwd(), "servers"));
53
+ }
54
+ catch {
55
+ candidates.push(path.resolve(process.cwd(), "packages/registry/servers"));
56
+ }
57
+ let targetDir = null;
58
+ for (const dir of candidates) {
59
+ try {
60
+ const stat = await fs.stat(dir);
61
+ if (stat.isDirectory()) {
62
+ targetDir = dir;
63
+ break;
64
+ }
65
+ }
66
+ catch { }
67
+ }
68
+ if (!targetDir) {
69
+ return;
70
+ }
71
+ const files = await fs.readdir(targetDir);
72
+ for (const file of files) {
73
+ if (!file.endsWith(".json"))
74
+ continue;
75
+ try {
76
+ const filePath = path.join(targetDir, file);
77
+ const content = await fs.readFile(filePath, "utf8");
78
+ const parsed = ServerListingSchema.parse(JSON.parse(content));
79
+ this.listings.set(parsed.name, parsed);
80
+ }
81
+ catch (err) {
82
+ console.warn(`Warning: failed to load server listing from ${file}:`, err);
83
+ }
84
+ }
85
+ }
86
+ /**
87
+ * Get a server listing by name
88
+ */
89
+ get(name) {
90
+ return this.listings.get(name);
91
+ }
92
+ /**
93
+ * Manually register or overwrite a server listing
94
+ */
95
+ register(listing) {
96
+ const validated = ServerListingSchema.parse(listing);
97
+ this.listings.set(validated.name, validated);
98
+ }
99
+ /**
100
+ * Search for servers by keyword (name, displayName, description, tags)
101
+ */
102
+ search(keyword) {
103
+ const lowerKeyword = keyword.toLowerCase();
104
+ return Array.from(this.listings.values()).filter((listing) => listing.name.toLowerCase().includes(lowerKeyword) ||
105
+ listing.displayName.toLowerCase().includes(lowerKeyword) ||
106
+ listing.description.toLowerCase().includes(lowerKeyword) ||
107
+ listing.tags?.some((tag) => tag.toLowerCase().includes(lowerKeyword)));
108
+ }
109
+ /**
110
+ * List all servers
111
+ */
112
+ list() {
113
+ return Array.from(this.listings.values());
114
+ }
115
+ /**
116
+ * Get servers by tag
117
+ */
118
+ filterByTag(tag) {
119
+ const lower = tag.toLowerCase();
120
+ return Array.from(this.listings.values()).filter((listing) => listing.tags?.some((t) => t.toLowerCase() === lower));
121
+ }
122
+ }
123
+ export function createRegistry(serversDir) {
124
+ return new ServerRegistry(serversDir);
125
+ }
126
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@yumdee/mcp-studio-registry",
3
+ "version": "0.1.0",
4
+ "description": "Community MCP server registry + CLI installer",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "mcp-studio": "./dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/maheshsingh20/YumDee-MCP-Studio.git",
21
+ "directory": "packages/registry"
22
+ },
23
+ "author": "Mahesh Singh <maheshsingh20>",
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "zod": "^3.22.0",
27
+ "@yumdee/mcp-studio-core": "0.1.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^20.0.0",
31
+ "typescript": "^5.3.0",
32
+ "vitest": "^1.0.0"
33
+ },
34
+ "scripts": {
35
+ "dev": "tsc --watch --incremental",
36
+ "build": "tsc",
37
+ "type-check": "tsc --noEmit",
38
+ "lint": "eslint src/ servers/",
39
+ "validate-listings": "node ./scripts/validate-listings.js",
40
+ "test": "vitest run"
41
+ }
42
+ }