@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,76 @@
1
+ export interface GatewayConfig {
2
+ /** MCP-Rating API base URL for registry lookups */
3
+ registryApiUrl: string;
4
+ /** Timeout for proxied tool calls in milliseconds */
5
+ proxyTimeoutMs: number;
6
+ /** Maximum simultaneous downstream server connections */
7
+ maxConnections: number;
8
+ /** Log level (stderr only — stdout is MCP JSON-RPC) */
9
+ logLevel: "debug" | "info" | "warn" | "error";
10
+ /** Path to permissions persistence file */
11
+ permissionsPath: string;
12
+ /** Path to gateway config file */
13
+ configPath: string;
14
+ /** Path to connection profiles file for auto-connect on startup */
15
+ profilesPath: string;
16
+ /** TTL for registry API cache entries in milliseconds (default 300_000 = 5 min) */
17
+ registryCacheTtlMs: number;
18
+ /** Max reconnect attempts when a downstream server crashes (default 5) */
19
+ reconnectMaxAttempts: number;
20
+ /** Base delay in ms for exponential reconnect backoff (default 1000) */
21
+ reconnectBaseDelayMs: number;
22
+ /** Interval in ms between health check pings (default 30_000) */
23
+ healthCheckIntervalMs: number;
24
+ /** Optional partner API key for ad tracking (ptr_*) */
25
+ partnerKey?: string;
26
+ /** Whether to enable ad tracking (default: true if partnerKey set) */
27
+ enableAdTracking?: boolean;
28
+ /** Whether to enable auto-install for missing commands (default: true) */
29
+ enableAutoInstall?: boolean;
30
+ /** Whether to enable usage analytics tracking (default: true) */
31
+ enableUsageTracking?: boolean;
32
+ /** Size of the usage analytics ring buffer (default: 10000) */
33
+ usageBufferSize?: number;
34
+ /** Whether to enable auto-recommend based on usage patterns (default: true) */
35
+ enableAutoRecommend?: boolean;
36
+ /** Path to server groups file */
37
+ groupsPath?: string;
38
+ /**
39
+ * Optional path for the durable safety audit log (JSONL, append-only). When
40
+ * set, every sandbox-relevant event (tool calls, blocked tools, blocked/
41
+ * allowed egress, connects) is appended for forensics / SIEM ingestion.
42
+ * When unset, the audit trail is in-memory only (queryable via mcp_audit).
43
+ */
44
+ auditLogPath?: string;
45
+ /**
46
+ * Whether to enable L2 container isolation (Docker/Podman) for untrusted
47
+ * servers. Default: false (opt-in). When true, community/unknown-tier
48
+ * servers run inside a constrained container; verified/trusted stay on L1.
49
+ * Falls back to L1 automatically if no container engine is available.
50
+ */
51
+ enableContainerIsolation?: boolean;
52
+ /** HTTP daemon port. When set, the gateway runs as an HTTP daemon. */
53
+ httpPort?: number;
54
+ /** HTTP daemon bind host (default 127.0.0.1). */
55
+ httpHost?: string;
56
+ /** Bearer token required for HTTP daemon requests (single-tenant mode). */
57
+ httpToken?: string;
58
+ /**
59
+ * Per-tenant bearer tokens: tenantId → token. Enables a multi-tenant daemon
60
+ * where each tenant authenticates with its own token and gets an isolated
61
+ * session pool + sandbox-manifest store. Merged with `httpToken` (which maps
62
+ * to tenant "default").
63
+ */
64
+ httpTokens?: Record<string, string>;
65
+ /**
66
+ * Allowed Host header values (DNS-rebinding protection). If unset, a safe
67
+ * default of localhost variants on the bind port is used. Set explicitly
68
+ * (e.g. ["gateway.example.com"]) when binding to 0.0.0.0 behind a domain.
69
+ */
70
+ httpAllowedHosts?: string[];
71
+ /**
72
+ * Allowed Origin header values. Browser requests carrying any other Origin
73
+ * are rejected. Non-browser clients (no Origin header) are always allowed.
74
+ */
75
+ httpAllowedOrigins?: string[];
76
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Ensure that the required command/package is available before spawning.
3
+ *
4
+ * For npx commands: ensures the `-y` flag is present so npx auto-installs.
5
+ * For other commands: checks if the binary exists on PATH.
6
+ *
7
+ * Does NOT actually install packages — we rely on npx -y for on-demand install.
8
+ * This function logs warnings when commands are not found.
9
+ */
10
+ export declare function ensureInstalled(command: string, args: string[]): Promise<{
11
+ command: string;
12
+ args: string[];
13
+ }>;
@@ -0,0 +1,61 @@
1
+ import { execSync } from "node:child_process";
2
+ import { log } from "../utils/logger.js";
3
+ const INSTALL_TIMEOUT_MS = 60_000;
4
+ /**
5
+ * Ensure that the required command/package is available before spawning.
6
+ *
7
+ * For npx commands: ensures the `-y` flag is present so npx auto-installs.
8
+ * For other commands: checks if the binary exists on PATH.
9
+ *
10
+ * Does NOT actually install packages — we rely on npx -y for on-demand install.
11
+ * This function logs warnings when commands are not found.
12
+ */
13
+ export async function ensureInstalled(command, args) {
14
+ // For npx: ensure -y flag is present
15
+ if (command === "npx") {
16
+ if (!args.includes("-y") && !args.includes("--yes")) {
17
+ log.debug("Adding -y flag to npx command for auto-install", {
18
+ args,
19
+ });
20
+ return { command, args: ["-y", ...args] };
21
+ }
22
+ return { command, args };
23
+ }
24
+ // For other commands: check if binary exists
25
+ if (!isCommandAvailable(command)) {
26
+ log.warn("Command not found on PATH", { command });
27
+ // Check if it looks like an npm package name (e.g., @scope/package or package-name)
28
+ if (looksLikeNpmPackage(command)) {
29
+ log.info("Command looks like an npm package, trying npx", { command });
30
+ // Rewrite to npx -y <command> <args>
31
+ return { command: "npx", args: ["-y", command, ...args] };
32
+ }
33
+ // Can't auto-install non-npm commands
34
+ throw new Error(`Command "${command}" not found. Please install it manually and ensure it's on your PATH.`);
35
+ }
36
+ return { command, args };
37
+ }
38
+ /**
39
+ * Check if a command is available on PATH.
40
+ */
41
+ function isCommandAvailable(command) {
42
+ try {
43
+ const whereCmd = process.platform === "win32" ? "where" : "which";
44
+ execSync(`${whereCmd} ${command}`, {
45
+ timeout: 5_000,
46
+ stdio: "pipe",
47
+ });
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * Heuristic: does the string look like an npm package name?
56
+ */
57
+ function looksLikeNpmPackage(name) {
58
+ // @scope/package or simple-package-name
59
+ return /^@?[a-z0-9][\w.-]*\/?[\w.-]*$/i.test(name);
60
+ }
61
+ //# sourceMappingURL=auto-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-installer.js","sourceRoot":"","sources":["../../src/connection/auto-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,IAAc;IAEd,qCAAqC;IACrC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,KAAK,CAAC,gDAAgD,EAAE;gBAC1D,IAAI;aACL,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,6CAA6C;IAC7C,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnD,oFAAoF;QACpF,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,+CAA+C,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACvE,qCAAqC;YACrC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAC5D,CAAC;QAED,sCAAsC;QACtC,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,uEAAuE,CAC3F,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,QAAQ,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,EAAE;YACjC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,wCAAwC;IACxC,OAAO,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,106 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { GatewayConfig } from "../config/types.js";
3
+ import type { RegistryClient } from "../registry/registry-client.js";
4
+ import type { PermissionManager } from "../permissions/permission-manager.js";
5
+ import type { ManifestResolver } from "../sandbox/manifest-resolver.js";
6
+ import type { AuditLog } from "../audit/audit-log.js";
7
+ import type { UsageTracker } from "../analytics/usage-tracker.js";
8
+ import type { PluginManager } from "../plugins/plugin-manager.js";
9
+ import type { DownstreamConnection, ConnectParams, ConnectionSummary, ConnectResult } from "./types.js";
10
+ import type { AdTracker } from "../ads/ad-tracker.js";
11
+ /**
12
+ * Manages the lifecycle of all downstream MCP server connections.
13
+ *
14
+ * Responsibilities:
15
+ * - Connect to downstream servers via stdio, SSE, WebSocket, or Streamable HTTP
16
+ * - Register/remove proxied tools, resources, and prompts on the gateway
17
+ * - Handle process crashes with auto-reconnect
18
+ * - Periodic health monitoring via pings
19
+ * - Notify the host client when tool/resource/prompt lists change
20
+ */
21
+ export declare class ConnectionManager {
22
+ private readonly mcpServer;
23
+ private readonly registryClient;
24
+ private readonly permissionManager;
25
+ private readonly config;
26
+ private readonly adTracker?;
27
+ private connections;
28
+ /** Debounce timers for tool re-sync per slug to prevent notification spam */
29
+ private resyncTimers;
30
+ /** Active reconnect timers per slug */
31
+ private reconnectTimers;
32
+ /** Health check interval handle */
33
+ private healthCheckInterval;
34
+ /** Gateway start time for uptime calculation */
35
+ readonly startedAt: Date;
36
+ /** Optional usage tracker for analytics */
37
+ usageTracker?: UsageTracker;
38
+ /** Optional plugin manager for middleware hooks */
39
+ pluginManager?: PluginManager;
40
+ /** Optional sandbox manifest resolver (L1 capability enforcement) */
41
+ manifestResolver?: ManifestResolver;
42
+ /** Optional safety audit trail (forensics log of sandboxed-server actions) */
43
+ auditLog?: AuditLog;
44
+ constructor(mcpServer: McpServer, registryClient: RegistryClient, permissionManager: PermissionManager, config: GatewayConfig, adTracker?: (AdTracker | null) | undefined);
45
+ /**
46
+ * Connect to a downstream MCP server.
47
+ *
48
+ * Resolves the install command (from registry or explicit params),
49
+ * connects via the appropriate transport, performs MCP handshake,
50
+ * fetches tools/resources/prompts, and registers proxied capabilities.
51
+ */
52
+ /**
53
+ * Names of declared auth env vars the server needs that aren't available in
54
+ * the current environment or the explicitly-provided `env`. Used to warn the
55
+ * user before a server crashes on a missing API key.
56
+ */
57
+ private missingAuthEnv;
58
+ connect(params: ConnectParams): Promise<ConnectResult>;
59
+ /**
60
+ * Disconnect from a downstream server.
61
+ */
62
+ disconnect(slug: string, options?: {
63
+ removeProfile?: boolean;
64
+ }): Promise<void>;
65
+ /**
66
+ * Disconnect all downstream servers (for graceful shutdown).
67
+ */
68
+ disconnectAll(): Promise<void>;
69
+ getConnection(slug: string): DownstreamConnection | undefined;
70
+ listConnections(): ConnectionSummary[];
71
+ get connectionCount(): number;
72
+ /**
73
+ * Load saved connection profiles and auto-connect each one.
74
+ * Called once during gateway startup.
75
+ */
76
+ autoConnectFromProfiles(): Promise<void>;
77
+ /**
78
+ * Start periodic health checks on all ready connections.
79
+ */
80
+ startHealthChecks(): void;
81
+ /**
82
+ * Stop the health check interval.
83
+ */
84
+ stopHealthChecks(): void;
85
+ private runHealthChecks;
86
+ /**
87
+ * Handle a downstream process crash.
88
+ * Removes proxied tools/resources/prompts and attempts auto-reconnect.
89
+ */
90
+ private handleProcessCrash;
91
+ private scheduleReconnect;
92
+ private attemptReconnect;
93
+ private cancelReconnect;
94
+ /**
95
+ * Handle a downstream server's tool list changing.
96
+ * Debounced to 500ms to prevent notification spam from chatty servers.
97
+ */
98
+ private handleToolsChanged;
99
+ /**
100
+ * Re-sync all proxied capabilities (tools, resources, prompts) for a downstream connection.
101
+ */
102
+ private doCapabilityResync;
103
+ private toSummary;
104
+ /** Derive a slug from a URL */
105
+ private slugFromUrl;
106
+ }