@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 +23 -0
- package/README.md +42 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +21 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +163 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +105 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +126 -0
- package/dist/registry.js.map +1 -0
- package/package.json +42 -0
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
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, 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"}
|
package/dist/registry.js
ADDED
|
@@ -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
|
+
}
|