@mcp-rating/gateway 0.2.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.
Files changed (168) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/dist/ads/ad-tracker.d.ts +63 -0
  4. package/dist/ads/ad-tracker.js +144 -0
  5. package/dist/ads/ad-tracker.js.map +1 -0
  6. package/dist/analytics/usage-tracker.d.ts +67 -0
  7. package/dist/analytics/usage-tracker.js +148 -0
  8. package/dist/analytics/usage-tracker.js.map +1 -0
  9. package/dist/audit/audit-log.d.ts +71 -0
  10. package/dist/audit/audit-log.js +72 -0
  11. package/dist/audit/audit-log.js.map +1 -0
  12. package/dist/config/gateway-config.d.ts +6 -0
  13. package/dist/config/gateway-config.js +135 -0
  14. package/dist/config/gateway-config.js.map +1 -0
  15. package/dist/config/groups.d.ts +29 -0
  16. package/dist/config/groups.js +102 -0
  17. package/dist/config/groups.js.map +1 -0
  18. package/dist/config/profiles.d.ts +42 -0
  19. package/dist/config/profiles.js +167 -0
  20. package/dist/config/profiles.js.map +1 -0
  21. package/dist/config/types.d.ts +76 -0
  22. package/dist/config/types.js +2 -0
  23. package/dist/config/types.js.map +1 -0
  24. package/dist/connection/auto-installer.d.ts +13 -0
  25. package/dist/connection/auto-installer.js +61 -0
  26. package/dist/connection/auto-installer.js.map +1 -0
  27. package/dist/connection/connection-manager.d.ts +106 -0
  28. package/dist/connection/connection-manager.js +845 -0
  29. package/dist/connection/connection-manager.js.map +1 -0
  30. package/dist/connection/downstream-client.d.ts +50 -0
  31. package/dist/connection/downstream-client.js +170 -0
  32. package/dist/connection/downstream-client.js.map +1 -0
  33. package/dist/connection/http-client.d.ts +12 -0
  34. package/dist/connection/http-client.js +26 -0
  35. package/dist/connection/http-client.js.map +1 -0
  36. package/dist/connection/sse-client.d.ts +12 -0
  37. package/dist/connection/sse-client.js +26 -0
  38. package/dist/connection/sse-client.js.map +1 -0
  39. package/dist/connection/transport-factory.d.ts +31 -0
  40. package/dist/connection/transport-factory.js +67 -0
  41. package/dist/connection/transport-factory.js.map +1 -0
  42. package/dist/connection/types.d.ts +134 -0
  43. package/dist/connection/types.js +5 -0
  44. package/dist/connection/types.js.map +1 -0
  45. package/dist/connection/ws-client.d.ts +12 -0
  46. package/dist/connection/ws-client.js +26 -0
  47. package/dist/connection/ws-client.js.map +1 -0
  48. package/dist/discovery/auto-recommender.d.ts +51 -0
  49. package/dist/discovery/auto-recommender.js +176 -0
  50. package/dist/discovery/auto-recommender.js.map +1 -0
  51. package/dist/gateway-server.d.ts +42 -0
  52. package/dist/gateway-server.js +135 -0
  53. package/dist/gateway-server.js.map +1 -0
  54. package/dist/http-daemon.d.ts +26 -0
  55. package/dist/http-daemon.js +302 -0
  56. package/dist/http-daemon.js.map +1 -0
  57. package/dist/index.d.ts +2 -0
  58. package/dist/index.js +83 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/meta-tools/ad-status.d.ts +8 -0
  61. package/dist/meta-tools/ad-status.js +41 -0
  62. package/dist/meta-tools/ad-status.js.map +1 -0
  63. package/dist/meta-tools/audit.d.ts +12 -0
  64. package/dist/meta-tools/audit.js +98 -0
  65. package/dist/meta-tools/audit.js.map +1 -0
  66. package/dist/meta-tools/call-tool.d.ts +11 -0
  67. package/dist/meta-tools/call-tool.js +65 -0
  68. package/dist/meta-tools/call-tool.js.map +1 -0
  69. package/dist/meta-tools/connect.d.ts +3 -0
  70. package/dist/meta-tools/connect.js +105 -0
  71. package/dist/meta-tools/connect.js.map +1 -0
  72. package/dist/meta-tools/disconnect.d.ts +3 -0
  73. package/dist/meta-tools/disconnect.js +30 -0
  74. package/dist/meta-tools/disconnect.js.map +1 -0
  75. package/dist/meta-tools/discover.d.ts +3 -0
  76. package/dist/meta-tools/discover.js +97 -0
  77. package/dist/meta-tools/discover.js.map +1 -0
  78. package/dist/meta-tools/groups.d.ts +7 -0
  79. package/dist/meta-tools/groups.js +237 -0
  80. package/dist/meta-tools/groups.js.map +1 -0
  81. package/dist/meta-tools/health.d.ts +4 -0
  82. package/dist/meta-tools/health.js +76 -0
  83. package/dist/meta-tools/health.js.map +1 -0
  84. package/dist/meta-tools/index.d.ts +28 -0
  85. package/dist/meta-tools/index.js +56 -0
  86. package/dist/meta-tools/index.js.map +1 -0
  87. package/dist/meta-tools/list-active.d.ts +3 -0
  88. package/dist/meta-tools/list-active.js +50 -0
  89. package/dist/meta-tools/list-active.js.map +1 -0
  90. package/dist/meta-tools/profiles.d.ts +6 -0
  91. package/dist/meta-tools/profiles.js +197 -0
  92. package/dist/meta-tools/profiles.js.map +1 -0
  93. package/dist/meta-tools/recommend.d.ts +14 -0
  94. package/dist/meta-tools/recommend.js +74 -0
  95. package/dist/meta-tools/recommend.js.map +1 -0
  96. package/dist/meta-tools/sandbox.d.ts +12 -0
  97. package/dist/meta-tools/sandbox.js +125 -0
  98. package/dist/meta-tools/sandbox.js.map +1 -0
  99. package/dist/meta-tools/server-info.d.ts +4 -0
  100. package/dist/meta-tools/server-info.js +156 -0
  101. package/dist/meta-tools/server-info.js.map +1 -0
  102. package/dist/meta-tools/usage.d.ts +6 -0
  103. package/dist/meta-tools/usage.js +149 -0
  104. package/dist/meta-tools/usage.js.map +1 -0
  105. package/dist/permissions/permission-manager.d.ts +26 -0
  106. package/dist/permissions/permission-manager.js +73 -0
  107. package/dist/permissions/permission-manager.js.map +1 -0
  108. package/dist/permissions/trust-tiers.d.ts +18 -0
  109. package/dist/permissions/trust-tiers.js +42 -0
  110. package/dist/permissions/trust-tiers.js.map +1 -0
  111. package/dist/plugins/builtin/logging-plugin.d.ts +6 -0
  112. package/dist/plugins/builtin/logging-plugin.js +41 -0
  113. package/dist/plugins/builtin/logging-plugin.js.map +1 -0
  114. package/dist/plugins/plugin-manager.d.ts +65 -0
  115. package/dist/plugins/plugin-manager.js +137 -0
  116. package/dist/plugins/plugin-manager.js.map +1 -0
  117. package/dist/proxy/prime-handlers.d.ts +27 -0
  118. package/dist/proxy/prime-handlers.js +47 -0
  119. package/dist/proxy/prime-handlers.js.map +1 -0
  120. package/dist/proxy/progress-forwarder.d.ts +44 -0
  121. package/dist/proxy/progress-forwarder.js +40 -0
  122. package/dist/proxy/progress-forwarder.js.map +1 -0
  123. package/dist/proxy/prompt-router.d.ts +25 -0
  124. package/dist/proxy/prompt-router.js +110 -0
  125. package/dist/proxy/prompt-router.js.map +1 -0
  126. package/dist/proxy/resource-router.d.ts +25 -0
  127. package/dist/proxy/resource-router.js +91 -0
  128. package/dist/proxy/resource-router.js.map +1 -0
  129. package/dist/proxy/schema-adapter.d.ts +11 -0
  130. package/dist/proxy/schema-adapter.js +36 -0
  131. package/dist/proxy/schema-adapter.js.map +1 -0
  132. package/dist/proxy/task-proxy.d.ts +28 -0
  133. package/dist/proxy/task-proxy.js +186 -0
  134. package/dist/proxy/task-proxy.js.map +1 -0
  135. package/dist/proxy/tool-router.d.ts +38 -0
  136. package/dist/proxy/tool-router.js +229 -0
  137. package/dist/proxy/tool-router.js.map +1 -0
  138. package/dist/proxy/ui-detect.d.ts +22 -0
  139. package/dist/proxy/ui-detect.js +30 -0
  140. package/dist/proxy/ui-detect.js.map +1 -0
  141. package/dist/registry/registry-client.d.ts +55 -0
  142. package/dist/registry/registry-client.js +211 -0
  143. package/dist/registry/registry-client.js.map +1 -0
  144. package/dist/registry/types.d.ts +69 -0
  145. package/dist/registry/types.js +2 -0
  146. package/dist/registry/types.js.map +1 -0
  147. package/dist/sandbox/container-runtime.d.ts +91 -0
  148. package/dist/sandbox/container-runtime.js +178 -0
  149. package/dist/sandbox/container-runtime.js.map +1 -0
  150. package/dist/sandbox/egress-proxy.d.ts +51 -0
  151. package/dist/sandbox/egress-proxy.js +146 -0
  152. package/dist/sandbox/egress-proxy.js.map +1 -0
  153. package/dist/sandbox/env-scoper.d.ts +29 -0
  154. package/dist/sandbox/env-scoper.js +60 -0
  155. package/dist/sandbox/env-scoper.js.map +1 -0
  156. package/dist/sandbox/manifest-resolver.d.ts +40 -0
  157. package/dist/sandbox/manifest-resolver.js +185 -0
  158. package/dist/sandbox/manifest-resolver.js.map +1 -0
  159. package/dist/sandbox/types.d.ts +88 -0
  160. package/dist/sandbox/types.js +21 -0
  161. package/dist/sandbox/types.js.map +1 -0
  162. package/dist/utils/errors.d.ts +39 -0
  163. package/dist/utils/errors.js +67 -0
  164. package/dist/utils/errors.js.map +1 -0
  165. package/dist/utils/logger.d.ts +16 -0
  166. package/dist/utils/logger.js +51 -0
  167. package/dist/utils/logger.js.map +1 -0
  168. package/package.json +72 -0
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ import { parseNamespacedTool } from "../proxy/tool-router.js";
3
+ import { buildProgressForwarder } from "../proxy/progress-forwarder.js";
4
+ import { toolError } from "../utils/errors.js";
5
+ import { log } from "../utils/logger.js";
6
+ /**
7
+ * Register the `mcp_call_tool` meta-tool.
8
+ *
9
+ * This is a fallback for MCP clients that don't refresh their tool list
10
+ * when `notifications/tools/list_changed` fires. The AI can call any
11
+ * tool on any connected downstream server by passing the namespaced
12
+ * tool name (e.g. "server-slug__echo") and a JSON arguments object.
13
+ */
14
+ export function registerCallTool(server, connectionManager) {
15
+ server.tool("mcp_call_tool", "Call a tool on a connected MCP server. Use this when dynamically connected tools aren't directly available. Pass the namespaced tool name (slug__toolName) and arguments.", {
16
+ name: z
17
+ .string()
18
+ .describe('Namespaced tool name: "server-slug__tool-name" (as shown by mcp_connect or mcp_list_active)'),
19
+ arguments: z
20
+ .record(z.string(), z.unknown())
21
+ .optional()
22
+ .default({})
23
+ .describe("Tool arguments as a JSON object"),
24
+ }, async ({ name, arguments: args },
25
+ // Loose-typed extra: see tool-router.ts for the same pattern. We only
26
+ // touch `_meta.progressToken` and `sendNotification` via the helper.
27
+ extra) => {
28
+ try {
29
+ // Parse the namespaced name
30
+ const parsed = parseNamespacedTool(name);
31
+ if (!parsed) {
32
+ return toolError(`Invalid tool name "${name}". Expected format: "server-slug__tool-name".`);
33
+ }
34
+ const { slug, toolName } = parsed;
35
+ // Look up the connection
36
+ const connection = connectionManager.getConnection(slug);
37
+ if (!connection) {
38
+ return toolError(`Server "${slug}" is not connected. Use mcp_connect first.`);
39
+ }
40
+ if (connection.state !== "ready") {
41
+ return toolError(`Server "${slug}" is in state "${connection.state}", not ready.`);
42
+ }
43
+ // Verify the tool exists on the downstream server
44
+ if (!connection.tools.has(toolName)) {
45
+ const available = [...connection.tools.keys()].join(", ");
46
+ return toolError(`Tool "${toolName}" not found on "${slug}". Available: ${available}`);
47
+ }
48
+ log.debug("mcp_call_tool proxying", { slug, toolName });
49
+ // Forward progress notifications back to the upstream client
50
+ // using the upstream-supplied progress token (Bug A fix).
51
+ const onprogress = buildProgressForwarder(extra, { slug, toolName });
52
+ const result = await connection.client.callTool({ name: toolName, arguments: args }, undefined, {
53
+ signal: AbortSignal.timeout(30_000),
54
+ ...(onprogress ? { onprogress } : {}),
55
+ });
56
+ return result;
57
+ }
58
+ catch (err) {
59
+ const msg = err instanceof Error ? err.message : String(err);
60
+ log.error("mcp_call_tool failed", { name, error: msg });
61
+ return toolError(msg);
62
+ }
63
+ });
64
+ }
65
+ //# sourceMappingURL=call-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-tool.js","sourceRoot":"","sources":["../../src/meta-tools/call-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ConnectionManager } from "../connection/connection-manager.js";
3
+ export declare function registerConnect(server: McpServer, connectionManager: ConnectionManager): void;
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ import { isConfirmationRequired } from "../connection/types.js";
3
+ import { namespaceTool } from "../proxy/tool-router.js";
4
+ import { TRUST_LABELS } from "../permissions/trust-tiers.js";
5
+ import { ManifestResolver } from "../sandbox/manifest-resolver.js";
6
+ import { toolError } from "../utils/errors.js";
7
+ export function registerConnect(server, connectionManager) {
8
+ server.tool("mcp_connect", "Connect to an MCP server and make its tools available. Provide either a server slug (from mcp_discover) to look up in the registry, OR an explicit command + args to spawn directly, OR a url for remote servers.", {
9
+ slug: z
10
+ .string()
11
+ .optional()
12
+ .describe("Server slug from MCP-Rating registry (e.g., '@modelcontextprotocol/inspector')"),
13
+ command: z
14
+ .string()
15
+ .optional()
16
+ .describe("Explicit command to spawn (e.g., 'npx'). Use when server is not in registry."),
17
+ args: z
18
+ .array(z.string())
19
+ .optional()
20
+ .describe("Command arguments (e.g., ['-y', '@modelcontextprotocol/server-everything'])"),
21
+ url: z
22
+ .string()
23
+ .optional()
24
+ .describe("URL for remote transports (SSE, WebSocket, Streamable HTTP). Use instead of command for remote servers."),
25
+ transportType: z
26
+ .enum(["stdio", "sse", "websocket", "streamable-http"])
27
+ .optional()
28
+ .describe("Transport type. Defaults to 'stdio' for command-based, auto-detected from URL scheme if url is provided."),
29
+ env: z
30
+ .record(z.string(), z.string())
31
+ .optional()
32
+ .describe("Additional environment variables for the server process"),
33
+ confirmed: z
34
+ .boolean()
35
+ .optional()
36
+ .describe("Set to true to confirm connection to community/unknown trust tier servers. Required when the initial connect returns a confirmation warning."),
37
+ saveProfile: z
38
+ .boolean()
39
+ .optional()
40
+ .describe("Set to true to save this connection as an auto-connect profile. The server will auto-reconnect on gateway restart."),
41
+ }, async ({ slug, command, args, url, transportType, env, confirmed, saveProfile }) => {
42
+ try {
43
+ const result = await connectionManager.connect({
44
+ slug,
45
+ command,
46
+ args,
47
+ url,
48
+ transportType,
49
+ env,
50
+ confirmed,
51
+ saveProfile,
52
+ });
53
+ // If confirmation is required, return the warning for the AI to relay
54
+ if (isConfirmationRequired(result)) {
55
+ return {
56
+ content: [
57
+ { type: "text", text: result.warning },
58
+ ],
59
+ };
60
+ }
61
+ const summary = result;
62
+ const tierLabel = TRUST_LABELS[summary.trustTier];
63
+ const conn = connectionManager.getConnection(summary.slug);
64
+ const toolNames = [...(conn?.tools.keys() || [])];
65
+ const namespacedTools = toolNames.map((t) => namespaceTool(summary.slug, t));
66
+ const lines = [
67
+ `## ✅ Connected: ${summary.displayName}`,
68
+ `**Trust:** [${tierLabel}] · **Transport:** ${summary.transportType} · **Tools:** ${summary.toolCount}`,
69
+ summary.serverInfo
70
+ ? `**Server:** ${summary.serverInfo.name} v${summary.serverInfo.version}`
71
+ : "",
72
+ "",
73
+ "### Available Tools",
74
+ ...namespacedTools.map((t) => `- \`${t}\``),
75
+ ];
76
+ if (summary.resourceCount > 0) {
77
+ lines.push("", `### Resources (${summary.resourceCount})`);
78
+ for (const uri of conn?.resources.keys() || []) {
79
+ lines.push(`- \`${summary.slug}://${uri}\``);
80
+ }
81
+ }
82
+ if (summary.promptCount > 0) {
83
+ lines.push("", `### Prompts (${summary.promptCount})`);
84
+ for (const name of conn?.prompts.keys() || []) {
85
+ lines.push(`- \`${summary.slug}__${name}\``);
86
+ }
87
+ }
88
+ // Sandbox: show what the server was granted access to (L1)
89
+ if (conn?.manifest) {
90
+ const summ = ManifestResolver.summarize(conn.manifest);
91
+ lines.push("", `### 🛡️ Sandbox (${summ.enforcement})`, ...summ.lines.map((l) => `- ${l}`));
92
+ }
93
+ lines.push("", `**Active connections:** ${connectionManager.connectionCount}`, "", `To disconnect: \`mcp_disconnect({slug: "${summary.slug}"})\``);
94
+ return {
95
+ content: [
96
+ { type: "text", text: lines.filter(Boolean).join("\n") },
97
+ ],
98
+ };
99
+ }
100
+ catch (err) {
101
+ return toolError(err instanceof Error ? err.message : String(err));
102
+ }
103
+ });
104
+ }
105
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/meta-tools/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ConnectionManager } from "../connection/connection-manager.js";
3
+ export declare function registerDisconnect(server: McpServer, connectionManager: ConnectionManager): void;
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { toolError } from "../utils/errors.js";
3
+ export function registerDisconnect(server, connectionManager) {
4
+ server.tool("mcp_disconnect", "Disconnect from a connected MCP server and remove its tools. Use mcp_list_active to see connected servers.", {
5
+ slug: z
6
+ .string()
7
+ .describe("Server slug of the connected server to disconnect"),
8
+ }, async ({ slug }) => {
9
+ try {
10
+ await connectionManager.disconnect(slug);
11
+ return {
12
+ content: [
13
+ {
14
+ type: "text",
15
+ text: [
16
+ `## ✅ Disconnected: ${slug}`,
17
+ "",
18
+ `All tools from this server have been removed.`,
19
+ `**Active connections:** ${connectionManager.connectionCount}`,
20
+ ].join("\n"),
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ catch (err) {
26
+ return toolError(err instanceof Error ? err.message : String(err));
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=disconnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disconnect.js","sourceRoot":"","sources":["../../src/meta-tools/disconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,iBAAoC;IAEpC,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,4GAA4G,EAC5G;QACE,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,CAAC,mDAAmD,CAAC;KACjE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,sBAAsB,IAAI,EAAE;4BAC5B,EAAE;4BACF,+CAA+C;4BAC/C,2BAA2B,iBAAiB,CAAC,eAAe,EAAE;yBAC/D,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CACd,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { RegistryClient } from "../registry/registry-client.js";
3
+ export declare function registerDiscover(server: McpServer, registryClient: RegistryClient): void;
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ import { TRUST_LABELS } from "../permissions/trust-tiers.js";
3
+ import { toolError } from "../utils/errors.js";
4
+ export function registerDiscover(server, registryClient) {
5
+ server.tool("mcp_discover", "Search the MCP-Rating registry for MCP servers. Returns servers with quality scores, trust tiers, and install information. Use this to find servers before connecting them with mcp_connect.", {
6
+ query: z.string().describe("Search query (server name, description, or capability)"),
7
+ category: z.string().optional().describe("Filter by category slug (e.g., 'developer-tools', 'data-databases')"),
8
+ limit: z.number().min(1).max(20).optional().describe("Max results (default 10)"),
9
+ }, async ({ query, category, limit }) => {
10
+ try {
11
+ const result = await registryClient.search(query, {
12
+ category,
13
+ limit: limit ?? 10,
14
+ });
15
+ if (result.data.length === 0) {
16
+ return {
17
+ content: [
18
+ {
19
+ type: "text",
20
+ text: `No MCP servers found for "${query}". Try a broader search term.`,
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ const lines = [
26
+ `## MCP Server Search: "${query}"`,
27
+ `Found ${result.total} servers (showing ${result.data.length})\n`,
28
+ ];
29
+ for (const server of result.data) {
30
+ const tier = (await import("../registry/registry-client.js")).RegistryClient.determineTrustTier(server);
31
+ const tierLabel = TRUST_LABELS[tier];
32
+ const score = server.qualityScore ?? 0;
33
+ const stars = server.stars ? `${server.stars.toLocaleString()} ★` : "";
34
+ const downloads = server.weeklyDownloads
35
+ ? `${server.weeklyDownloads.toLocaleString()}/wk`
36
+ : "";
37
+ const cat = server.category?.name || "";
38
+ const tools = server.tools?.length
39
+ ? `${server.tools.length} tools`
40
+ : "";
41
+ const discovery = server.supportsDiscovery ? "✓ Discovery" : "";
42
+ const requiresAuth = server.requiresAuth || server.metadata?.requiresAuth;
43
+ const authLabel = requiresAuth ? "🔑 Auth Required" : "";
44
+ // How you run it — the single most useful thing to know at discovery time.
45
+ const amLabels = {
46
+ npm: "npx",
47
+ pypi: "uvx",
48
+ docker: "Docker",
49
+ remote: "Remote (URL)",
50
+ "github-manual": "manual build",
51
+ };
52
+ const access = server.accessMethod
53
+ ? amLabels[server.accessMethod] || server.accessMethod
54
+ : "";
55
+ // Surface the safety screen here, not just on connect — "judge before
56
+ // you run" only works if the warning arrives while choosing.
57
+ const safety = typeof server.safetyScore === "number" && server.safetyScore < 50
58
+ ? `⚠️ Safety ${server.safetyScore}`
59
+ : "";
60
+ const stats = [access, stars, downloads, cat, tools, discovery, authLabel, safety]
61
+ .filter(Boolean)
62
+ .join(" · ");
63
+ lines.push(`### ${server.name}`, `**Slug:** \`${server.slug}\` · **Score:** ${score}/100 · **Trust:** [${tierLabel}]`, server.description || "_No description_", stats ? `📊 ${stats}` : "");
64
+ // Show auth env vars if present
65
+ const authEnvVars = server.authDetails?.envVars || server.metadata?.authEnvVars || [];
66
+ if (authEnvVars.length > 0) {
67
+ lines.push(`🔑 Requires: ${authEnvVars.map(ev => `\`${ev.name}\``).join(", ")}`);
68
+ }
69
+ // Remote servers have no install command by design — you connect by URL.
70
+ // Warning on those read as "broken server" when nothing was wrong.
71
+ lines.push(server.installCommand
72
+ ? `🔧 Install: \`${server.installCommand}\``
73
+ : server.accessMethod === "remote"
74
+ ? "🌐 Hosted server — no install needed"
75
+ : "⚠️ No install command recorded (try connecting by slug)");
76
+ // Build connect suggestion with env template if auth is required
77
+ if (authEnvVars.length > 0) {
78
+ const envTemplate = authEnvVars
79
+ .map((ev) => `"${ev.name}": "<your-${ev.name.toLowerCase()}>"`)
80
+ .join(", ");
81
+ lines.push(`→ Connect: \`mcp_connect({slug: "${server.slug}", env: {${envTemplate}}})\``);
82
+ }
83
+ else {
84
+ lines.push(`→ Connect: \`mcp_connect({slug: "${server.slug}"})\``);
85
+ }
86
+ lines.push("");
87
+ }
88
+ return {
89
+ content: [{ type: "text", text: lines.join("\n") }],
90
+ };
91
+ }
92
+ catch (err) {
93
+ return toolError(`Registry search failed: ${err instanceof Error ? err.message : String(err)}`);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/meta-tools/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ConnectionManager } from "../connection/connection-manager.js";
3
+ /**
4
+ * Register the `mcp_groups` meta-tool for managing server groups.
5
+ * Groups allow atomic connect/disconnect of sets of servers.
6
+ */
7
+ export declare function registerGroups(server: McpServer, connectionManager: ConnectionManager, groupsPath: string): void;
@@ -0,0 +1,237 @@
1
+ import { z } from "zod";
2
+ import { createGroup, deleteGroup, listGroups, getGroup, addToGroup, removeFromGroup, groupToConnectParams, } from "../config/groups.js";
3
+ import { toolError } from "../utils/errors.js";
4
+ // Default groups path — lives alongside profiles
5
+ const DEFAULT_GROUPS_PATH_SUFFIX = "mcp-gateway-groups.json";
6
+ /**
7
+ * Register the `mcp_groups` meta-tool for managing server groups.
8
+ * Groups allow atomic connect/disconnect of sets of servers.
9
+ */
10
+ export function registerGroups(server, connectionManager, groupsPath) {
11
+ server.tool("mcp_groups", "Manage server groups for atomic connect/disconnect of sets of servers.", {
12
+ action: z
13
+ .enum(["list", "create", "delete", "add_server", "remove_server", "connect", "disconnect", "show"])
14
+ .describe("Action: list, create, delete, add_server, remove_server, connect (all in group), disconnect (all in group), show (details)"),
15
+ name: z
16
+ .string()
17
+ .optional()
18
+ .describe("Group name (required for all actions except list)"),
19
+ description: z
20
+ .string()
21
+ .optional()
22
+ .describe("Group description (optional, for create)"),
23
+ slug: z
24
+ .string()
25
+ .optional()
26
+ .describe("Server slug to add/remove from a group"),
27
+ command: z
28
+ .string()
29
+ .optional()
30
+ .describe("Explicit command for the server (for add_server with stdio)"),
31
+ args: z
32
+ .array(z.string())
33
+ .optional()
34
+ .describe("Command arguments (for add_server with stdio)"),
35
+ url: z
36
+ .string()
37
+ .optional()
38
+ .describe("Server URL (for add_server with SSE/WS/HTTP)"),
39
+ transportType: z
40
+ .enum(["stdio", "sse", "websocket", "streamable-http"])
41
+ .optional()
42
+ .describe("Transport type (for add_server)"),
43
+ }, async ({ action, name, description, slug, command, args, url, transportType }) => {
44
+ try {
45
+ switch (action) {
46
+ case "list": {
47
+ const groups = listGroups(groupsPath);
48
+ if (groups.length === 0) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: "text",
53
+ text: "No server groups exist yet.\n\nUse `mcp_groups({action: \"create\", name: \"my-group\"})` to create one.",
54
+ },
55
+ ],
56
+ };
57
+ }
58
+ const lines = [
59
+ `## Server Groups (${groups.length})`,
60
+ "",
61
+ ];
62
+ for (const g of groups) {
63
+ lines.push(`### ${g.name}`, g.description ? `_${g.description}_` : "", `**Servers:** ${g.servers.length}`, "");
64
+ }
65
+ return {
66
+ content: [{ type: "text", text: lines.filter(Boolean).join("\n") }],
67
+ };
68
+ }
69
+ case "create": {
70
+ if (!name)
71
+ return toolError("Group name is required for 'create'.");
72
+ createGroup(groupsPath, name, description);
73
+ return {
74
+ content: [
75
+ {
76
+ type: "text",
77
+ text: `✅ Group **"${name}"** created.${description ? ` (${description})` : ""}\n\nAdd servers with \`mcp_groups({action: "add_server", name: "${name}", slug: "..."})\``,
78
+ },
79
+ ],
80
+ };
81
+ }
82
+ case "delete": {
83
+ if (!name)
84
+ return toolError("Group name is required for 'delete'.");
85
+ const deleted = deleteGroup(groupsPath, name);
86
+ if (!deleted)
87
+ return toolError(`Group "${name}" not found.`);
88
+ return {
89
+ content: [
90
+ { type: "text", text: `✅ Group **"${name}"** deleted.` },
91
+ ],
92
+ };
93
+ }
94
+ case "add_server": {
95
+ if (!name)
96
+ return toolError("Group name is required for 'add_server'.");
97
+ if (!slug && !command && !url) {
98
+ return toolError("Either 'slug', 'command', or 'url' is required to add a server.");
99
+ }
100
+ addToGroup(groupsPath, name, {
101
+ slug,
102
+ command,
103
+ args,
104
+ url,
105
+ transportType: transportType,
106
+ });
107
+ const identifier = slug || command || url;
108
+ return {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: `✅ Server **${identifier}** added to group **"${name}"**.`,
113
+ },
114
+ ],
115
+ };
116
+ }
117
+ case "remove_server": {
118
+ if (!name)
119
+ return toolError("Group name is required for 'remove_server'.");
120
+ if (!slug)
121
+ return toolError("Server slug is required to remove a server.");
122
+ removeFromGroup(groupsPath, name, slug);
123
+ return {
124
+ content: [
125
+ {
126
+ type: "text",
127
+ text: `✅ Server **${slug}** removed from group **"${name}"**.`,
128
+ },
129
+ ],
130
+ };
131
+ }
132
+ case "connect": {
133
+ if (!name)
134
+ return toolError("Group name is required for 'connect'.");
135
+ const group = getGroup(groupsPath, name);
136
+ if (!group)
137
+ return toolError(`Group "${name}" not found.`);
138
+ if (group.servers.length === 0) {
139
+ return toolError(`Group "${name}" has no servers.`);
140
+ }
141
+ const params = groupToConnectParams(group);
142
+ const results = [];
143
+ let successCount = 0;
144
+ // Connect all servers in parallel
145
+ const outcomes = await Promise.allSettled(params.map((p) => connectionManager.connect(p)));
146
+ for (let i = 0; i < outcomes.length; i++) {
147
+ const outcome = outcomes[i];
148
+ const identifier = params[i].slug || params[i].command || params[i].url || "unknown";
149
+ if (outcome.status === "fulfilled") {
150
+ successCount++;
151
+ results.push(`✅ ${identifier}`);
152
+ }
153
+ else {
154
+ const reason = outcome.reason instanceof Error
155
+ ? outcome.reason.message
156
+ : String(outcome.reason);
157
+ results.push(`❌ ${identifier}: ${reason}`);
158
+ }
159
+ }
160
+ const lines = [
161
+ `## Group "${name}" — Connect Results`,
162
+ "",
163
+ `**Success:** ${successCount}/${params.length}`,
164
+ "",
165
+ ...results,
166
+ "",
167
+ `**Active connections:** ${connectionManager.connectionCount}`,
168
+ ];
169
+ return {
170
+ content: [{ type: "text", text: lines.join("\n") }],
171
+ };
172
+ }
173
+ case "disconnect": {
174
+ if (!name)
175
+ return toolError("Group name is required for 'disconnect'.");
176
+ const group = getGroup(groupsPath, name);
177
+ if (!group)
178
+ return toolError(`Group "${name}" not found.`);
179
+ const results = [];
180
+ let successCount = 0;
181
+ for (const entry of group.servers) {
182
+ const identifier = entry.slug || entry.command || entry.url || "unknown";
183
+ try {
184
+ await connectionManager.disconnect(identifier, { removeProfile: false });
185
+ successCount++;
186
+ results.push(`✅ ${identifier}`);
187
+ }
188
+ catch (err) {
189
+ results.push(`❌ ${identifier}: ${err instanceof Error ? err.message : String(err)}`);
190
+ }
191
+ }
192
+ const lines = [
193
+ `## Group "${name}" — Disconnect Results`,
194
+ "",
195
+ `**Disconnected:** ${successCount}/${group.servers.length}`,
196
+ "",
197
+ ...results,
198
+ ];
199
+ return {
200
+ content: [{ type: "text", text: lines.join("\n") }],
201
+ };
202
+ }
203
+ case "show": {
204
+ if (!name)
205
+ return toolError("Group name is required for 'show'.");
206
+ const group = getGroup(groupsPath, name);
207
+ if (!group)
208
+ return toolError(`Group "${name}" not found.`);
209
+ const lines = [
210
+ `## Group: ${group.name}`,
211
+ group.description ? `_${group.description}_` : "",
212
+ "",
213
+ `**Servers:** ${group.servers.length}`,
214
+ "",
215
+ ];
216
+ for (const s of group.servers) {
217
+ const transport = s.transportType || "stdio";
218
+ const target = s.slug || s.command || s.url || "unknown";
219
+ lines.push(`- \`${target}\` (${transport})`);
220
+ }
221
+ if (group.servers.length === 0) {
222
+ lines.push("_No servers in this group yet._");
223
+ }
224
+ return {
225
+ content: [{ type: "text", text: lines.filter(Boolean).join("\n") }],
226
+ };
227
+ }
228
+ default:
229
+ return toolError(`Unknown action: ${action}`);
230
+ }
231
+ }
232
+ catch (err) {
233
+ return toolError(err instanceof Error ? err.message : String(err));
234
+ }
235
+ });
236
+ }
237
+ //# sourceMappingURL=groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/meta-tools/groups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ConnectionManager } from "../connection/connection-manager.js";
3
+ import type { RegistryClient } from "../registry/registry-client.js";
4
+ export declare function registerHealth(server: McpServer, connectionManager: ConnectionManager, registryClient: RegistryClient): void;