@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.
- package/LICENSE +21 -0
- package/README.md +130 -0
- package/dist/ads/ad-tracker.d.ts +63 -0
- package/dist/ads/ad-tracker.js +144 -0
- package/dist/ads/ad-tracker.js.map +1 -0
- package/dist/analytics/usage-tracker.d.ts +67 -0
- package/dist/analytics/usage-tracker.js +148 -0
- package/dist/analytics/usage-tracker.js.map +1 -0
- package/dist/audit/audit-log.d.ts +71 -0
- package/dist/audit/audit-log.js +72 -0
- package/dist/audit/audit-log.js.map +1 -0
- package/dist/config/gateway-config.d.ts +6 -0
- package/dist/config/gateway-config.js +135 -0
- package/dist/config/gateway-config.js.map +1 -0
- package/dist/config/groups.d.ts +29 -0
- package/dist/config/groups.js +102 -0
- package/dist/config/groups.js.map +1 -0
- package/dist/config/profiles.d.ts +42 -0
- package/dist/config/profiles.js +167 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/config/types.d.ts +76 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/connection/auto-installer.d.ts +13 -0
- package/dist/connection/auto-installer.js +61 -0
- package/dist/connection/auto-installer.js.map +1 -0
- package/dist/connection/connection-manager.d.ts +106 -0
- package/dist/connection/connection-manager.js +845 -0
- package/dist/connection/connection-manager.js.map +1 -0
- package/dist/connection/downstream-client.d.ts +50 -0
- package/dist/connection/downstream-client.js +170 -0
- package/dist/connection/downstream-client.js.map +1 -0
- package/dist/connection/http-client.d.ts +12 -0
- package/dist/connection/http-client.js +26 -0
- package/dist/connection/http-client.js.map +1 -0
- package/dist/connection/sse-client.d.ts +12 -0
- package/dist/connection/sse-client.js +26 -0
- package/dist/connection/sse-client.js.map +1 -0
- package/dist/connection/transport-factory.d.ts +31 -0
- package/dist/connection/transport-factory.js +67 -0
- package/dist/connection/transport-factory.js.map +1 -0
- package/dist/connection/types.d.ts +134 -0
- package/dist/connection/types.js +5 -0
- package/dist/connection/types.js.map +1 -0
- package/dist/connection/ws-client.d.ts +12 -0
- package/dist/connection/ws-client.js +26 -0
- package/dist/connection/ws-client.js.map +1 -0
- package/dist/discovery/auto-recommender.d.ts +51 -0
- package/dist/discovery/auto-recommender.js +176 -0
- package/dist/discovery/auto-recommender.js.map +1 -0
- package/dist/gateway-server.d.ts +42 -0
- package/dist/gateway-server.js +135 -0
- package/dist/gateway-server.js.map +1 -0
- package/dist/http-daemon.d.ts +26 -0
- package/dist/http-daemon.js +302 -0
- package/dist/http-daemon.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/meta-tools/ad-status.d.ts +8 -0
- package/dist/meta-tools/ad-status.js +41 -0
- package/dist/meta-tools/ad-status.js.map +1 -0
- package/dist/meta-tools/audit.d.ts +12 -0
- package/dist/meta-tools/audit.js +98 -0
- package/dist/meta-tools/audit.js.map +1 -0
- package/dist/meta-tools/call-tool.d.ts +11 -0
- package/dist/meta-tools/call-tool.js +65 -0
- package/dist/meta-tools/call-tool.js.map +1 -0
- package/dist/meta-tools/connect.d.ts +3 -0
- package/dist/meta-tools/connect.js +105 -0
- package/dist/meta-tools/connect.js.map +1 -0
- package/dist/meta-tools/disconnect.d.ts +3 -0
- package/dist/meta-tools/disconnect.js +30 -0
- package/dist/meta-tools/disconnect.js.map +1 -0
- package/dist/meta-tools/discover.d.ts +3 -0
- package/dist/meta-tools/discover.js +97 -0
- package/dist/meta-tools/discover.js.map +1 -0
- package/dist/meta-tools/groups.d.ts +7 -0
- package/dist/meta-tools/groups.js +237 -0
- package/dist/meta-tools/groups.js.map +1 -0
- package/dist/meta-tools/health.d.ts +4 -0
- package/dist/meta-tools/health.js +76 -0
- package/dist/meta-tools/health.js.map +1 -0
- package/dist/meta-tools/index.d.ts +28 -0
- package/dist/meta-tools/index.js +56 -0
- package/dist/meta-tools/index.js.map +1 -0
- package/dist/meta-tools/list-active.d.ts +3 -0
- package/dist/meta-tools/list-active.js +50 -0
- package/dist/meta-tools/list-active.js.map +1 -0
- package/dist/meta-tools/profiles.d.ts +6 -0
- package/dist/meta-tools/profiles.js +197 -0
- package/dist/meta-tools/profiles.js.map +1 -0
- package/dist/meta-tools/recommend.d.ts +14 -0
- package/dist/meta-tools/recommend.js +74 -0
- package/dist/meta-tools/recommend.js.map +1 -0
- package/dist/meta-tools/sandbox.d.ts +12 -0
- package/dist/meta-tools/sandbox.js +125 -0
- package/dist/meta-tools/sandbox.js.map +1 -0
- package/dist/meta-tools/server-info.d.ts +4 -0
- package/dist/meta-tools/server-info.js +156 -0
- package/dist/meta-tools/server-info.js.map +1 -0
- package/dist/meta-tools/usage.d.ts +6 -0
- package/dist/meta-tools/usage.js +149 -0
- package/dist/meta-tools/usage.js.map +1 -0
- package/dist/permissions/permission-manager.d.ts +26 -0
- package/dist/permissions/permission-manager.js +73 -0
- package/dist/permissions/permission-manager.js.map +1 -0
- package/dist/permissions/trust-tiers.d.ts +18 -0
- package/dist/permissions/trust-tiers.js +42 -0
- package/dist/permissions/trust-tiers.js.map +1 -0
- package/dist/plugins/builtin/logging-plugin.d.ts +6 -0
- package/dist/plugins/builtin/logging-plugin.js +41 -0
- package/dist/plugins/builtin/logging-plugin.js.map +1 -0
- package/dist/plugins/plugin-manager.d.ts +65 -0
- package/dist/plugins/plugin-manager.js +137 -0
- package/dist/plugins/plugin-manager.js.map +1 -0
- package/dist/proxy/prime-handlers.d.ts +27 -0
- package/dist/proxy/prime-handlers.js +47 -0
- package/dist/proxy/prime-handlers.js.map +1 -0
- package/dist/proxy/progress-forwarder.d.ts +44 -0
- package/dist/proxy/progress-forwarder.js +40 -0
- package/dist/proxy/progress-forwarder.js.map +1 -0
- package/dist/proxy/prompt-router.d.ts +25 -0
- package/dist/proxy/prompt-router.js +110 -0
- package/dist/proxy/prompt-router.js.map +1 -0
- package/dist/proxy/resource-router.d.ts +25 -0
- package/dist/proxy/resource-router.js +91 -0
- package/dist/proxy/resource-router.js.map +1 -0
- package/dist/proxy/schema-adapter.d.ts +11 -0
- package/dist/proxy/schema-adapter.js +36 -0
- package/dist/proxy/schema-adapter.js.map +1 -0
- package/dist/proxy/task-proxy.d.ts +28 -0
- package/dist/proxy/task-proxy.js +186 -0
- package/dist/proxy/task-proxy.js.map +1 -0
- package/dist/proxy/tool-router.d.ts +38 -0
- package/dist/proxy/tool-router.js +229 -0
- package/dist/proxy/tool-router.js.map +1 -0
- package/dist/proxy/ui-detect.d.ts +22 -0
- package/dist/proxy/ui-detect.js +30 -0
- package/dist/proxy/ui-detect.js.map +1 -0
- package/dist/registry/registry-client.d.ts +55 -0
- package/dist/registry/registry-client.js +211 -0
- package/dist/registry/registry-client.js.map +1 -0
- package/dist/registry/types.d.ts +69 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/sandbox/container-runtime.d.ts +91 -0
- package/dist/sandbox/container-runtime.js +178 -0
- package/dist/sandbox/container-runtime.js.map +1 -0
- package/dist/sandbox/egress-proxy.d.ts +51 -0
- package/dist/sandbox/egress-proxy.js +146 -0
- package/dist/sandbox/egress-proxy.js.map +1 -0
- package/dist/sandbox/env-scoper.d.ts +29 -0
- package/dist/sandbox/env-scoper.js +60 -0
- package/dist/sandbox/env-scoper.js.map +1 -0
- package/dist/sandbox/manifest-resolver.d.ts +40 -0
- package/dist/sandbox/manifest-resolver.js +185 -0
- package/dist/sandbox/manifest-resolver.js.map +1 -0
- package/dist/sandbox/types.d.ts +88 -0
- package/dist/sandbox/types.js +21 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/utils/errors.d.ts +39 -0
- package/dist/utils/errors.js +67 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.js +51 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { log } from "../utils/logger.js";
|
|
3
|
+
/**
|
|
4
|
+
* Trust-tier → default policy mapping.
|
|
5
|
+
*
|
|
6
|
+
* The principle: the less we trust a server, the less it gets by default.
|
|
7
|
+
* Verified/trusted servers get permissive defaults (they've earned it);
|
|
8
|
+
* community/unknown servers get locked down and must be explicitly granted.
|
|
9
|
+
*/
|
|
10
|
+
const TIER_DEFAULTS = {
|
|
11
|
+
verified: {
|
|
12
|
+
enforcement: "l1-process",
|
|
13
|
+
inheritDefaults: true,
|
|
14
|
+
network: "all",
|
|
15
|
+
subprocess: true,
|
|
16
|
+
},
|
|
17
|
+
trusted: {
|
|
18
|
+
enforcement: "l1-process",
|
|
19
|
+
inheritDefaults: true,
|
|
20
|
+
network: "all",
|
|
21
|
+
subprocess: true,
|
|
22
|
+
},
|
|
23
|
+
community: {
|
|
24
|
+
enforcement: "l1-process",
|
|
25
|
+
inheritDefaults: true,
|
|
26
|
+
network: "allowlist",
|
|
27
|
+
subprocess: false,
|
|
28
|
+
},
|
|
29
|
+
unknown: {
|
|
30
|
+
enforcement: "l1-process",
|
|
31
|
+
inheritDefaults: true, // still need PATH/HOME to start
|
|
32
|
+
network: "none",
|
|
33
|
+
subprocess: false,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Resolves and persists per-server capability manifests.
|
|
38
|
+
*
|
|
39
|
+
* A manifest is derived from (in priority order):
|
|
40
|
+
* 1. A user-saved override (persisted to disk)
|
|
41
|
+
* 2. Trust-tier defaults + the server's declared auth env vars
|
|
42
|
+
*/
|
|
43
|
+
export class ManifestResolver {
|
|
44
|
+
overrides = new Map();
|
|
45
|
+
filePath;
|
|
46
|
+
/**
|
|
47
|
+
* When true, untrusted tiers (community/unknown) default to l2-container
|
|
48
|
+
* enforcement instead of l1-process. Verified/trusted stay on L1.
|
|
49
|
+
*/
|
|
50
|
+
containerIsolation;
|
|
51
|
+
constructor(filePath, containerIsolation = false) {
|
|
52
|
+
this.filePath = filePath;
|
|
53
|
+
this.containerIsolation = containerIsolation;
|
|
54
|
+
this.loadFromDisk();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve the effective manifest for a server. Uses a saved override if one
|
|
58
|
+
* exists; otherwise derives defaults from the trust tier and the server's
|
|
59
|
+
* declared auth env vars (so e.g. a GitHub server gets GITHUB_TOKEN allowed
|
|
60
|
+
* but nothing else).
|
|
61
|
+
*/
|
|
62
|
+
resolve(slug, trustTier, registryServer,
|
|
63
|
+
/** Env var names the user explicitly supplied at connect time. */
|
|
64
|
+
userProvidedEnvKeys = []) {
|
|
65
|
+
const override = this.overrides.get(slug);
|
|
66
|
+
if (override) {
|
|
67
|
+
log.debug("Using saved manifest override", { slug });
|
|
68
|
+
return override;
|
|
69
|
+
}
|
|
70
|
+
const tier = TIER_DEFAULTS[trustTier];
|
|
71
|
+
// Escalate untrusted tiers to container isolation when enabled.
|
|
72
|
+
const enforcement = this.containerIsolation &&
|
|
73
|
+
(trustTier === "community" || trustTier === "unknown")
|
|
74
|
+
? "l2-container"
|
|
75
|
+
: tier.enforcement;
|
|
76
|
+
// Build the env allowlist from the server's declared auth vars plus any
|
|
77
|
+
// vars the user explicitly passed (they clearly intend those to flow).
|
|
78
|
+
const declaredEnv = (registryServer?.authDetails?.envVars ?? []).map((e) => e.name);
|
|
79
|
+
const allEnv = new Set([...declaredEnv, ...userProvidedEnvKeys]);
|
|
80
|
+
return {
|
|
81
|
+
version: 1,
|
|
82
|
+
slug,
|
|
83
|
+
enforcement,
|
|
84
|
+
env: {
|
|
85
|
+
allow: [...allEnv],
|
|
86
|
+
inheritDefaults: tier.inheritDefaults,
|
|
87
|
+
},
|
|
88
|
+
network: {
|
|
89
|
+
mode: tier.network,
|
|
90
|
+
allow: [],
|
|
91
|
+
},
|
|
92
|
+
filesystem: {
|
|
93
|
+
read: [],
|
|
94
|
+
write: [],
|
|
95
|
+
},
|
|
96
|
+
subprocess: tier.subprocess,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Get a saved override for a slug, if one exists. */
|
|
100
|
+
getOverride(slug) {
|
|
101
|
+
return this.overrides.get(slug);
|
|
102
|
+
}
|
|
103
|
+
/** Persist a user-customized manifest. */
|
|
104
|
+
saveOverride(manifest) {
|
|
105
|
+
this.overrides.set(manifest.slug, manifest);
|
|
106
|
+
this.saveToDisk();
|
|
107
|
+
}
|
|
108
|
+
/** Remove a saved override, reverting to trust-tier defaults. */
|
|
109
|
+
clearOverride(slug) {
|
|
110
|
+
if (this.overrides.delete(slug))
|
|
111
|
+
this.saveToDisk();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Build a human-readable summary of a manifest for the HITL prompt.
|
|
115
|
+
*/
|
|
116
|
+
static summarize(manifest) {
|
|
117
|
+
const lines = [];
|
|
118
|
+
let sensitive = false;
|
|
119
|
+
// Environment
|
|
120
|
+
if (manifest.env.allow.length > 0) {
|
|
121
|
+
lines.push(`Read ${manifest.env.allow.length} environment variable(s): ${manifest.env.allow.join(", ")}`);
|
|
122
|
+
sensitive = true;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
lines.push("No environment variables (secrets) exposed");
|
|
126
|
+
}
|
|
127
|
+
// Network
|
|
128
|
+
switch (manifest.network.mode) {
|
|
129
|
+
case "none":
|
|
130
|
+
lines.push("No network access (declared)");
|
|
131
|
+
break;
|
|
132
|
+
case "allowlist":
|
|
133
|
+
lines.push(manifest.network.allow.length > 0
|
|
134
|
+
? `Network limited to: ${manifest.network.allow.join(", ")} (declared)`
|
|
135
|
+
: "Network: allowlist (none specified) (declared)");
|
|
136
|
+
break;
|
|
137
|
+
case "all":
|
|
138
|
+
lines.push("Full network access (declared)");
|
|
139
|
+
sensitive = true;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
// Filesystem
|
|
143
|
+
const fsRead = manifest.filesystem.read.length;
|
|
144
|
+
const fsWrite = manifest.filesystem.write.length;
|
|
145
|
+
if (fsRead > 0 || fsWrite > 0) {
|
|
146
|
+
lines.push(`Filesystem: ${fsRead} read path(s), ${fsWrite} write path(s) (declared)`);
|
|
147
|
+
if (fsWrite > 0)
|
|
148
|
+
sensitive = true;
|
|
149
|
+
}
|
|
150
|
+
// Subprocess
|
|
151
|
+
if (manifest.subprocess) {
|
|
152
|
+
lines.push("May spawn subprocesses (declared)");
|
|
153
|
+
sensitive = true;
|
|
154
|
+
}
|
|
155
|
+
return { enforcement: manifest.enforcement, lines, hasSensitiveGrants: sensitive };
|
|
156
|
+
}
|
|
157
|
+
loadFromDisk() {
|
|
158
|
+
if (!existsSync(this.filePath))
|
|
159
|
+
return;
|
|
160
|
+
try {
|
|
161
|
+
const raw = readFileSync(this.filePath, "utf-8");
|
|
162
|
+
const data = JSON.parse(raw);
|
|
163
|
+
for (const [slug, manifest] of Object.entries(data.manifests || {})) {
|
|
164
|
+
this.overrides.set(slug, manifest);
|
|
165
|
+
}
|
|
166
|
+
log.debug("Loaded manifest overrides", { count: this.overrides.size });
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
log.warn("Failed to load manifests file, using tier defaults");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
saveToDisk() {
|
|
173
|
+
const data = { manifests: {} };
|
|
174
|
+
for (const [slug, manifest] of this.overrides) {
|
|
175
|
+
data.manifests[slug] = manifest;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
writeFileSync(this.filePath, JSON.stringify(data, null, 2), "utf-8");
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
log.warn("Failed to save manifests", { error: String(err) });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=manifest-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-resolver.js","sourceRoot":"","sources":["../../src/sandbox/manifest-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox capability model.
|
|
3
|
+
*
|
|
4
|
+
* A CapabilityManifest declares what a downstream MCP server is permitted to
|
|
5
|
+
* access. It is the security contract between the gateway and an untrusted
|
|
6
|
+
* server.
|
|
7
|
+
*
|
|
8
|
+
* Enforcement is layered:
|
|
9
|
+
* - **L1 (this release)**: environment-variable scoping is enforced at process
|
|
10
|
+
* spawn (cross-platform, in-process). Network / filesystem / subprocess
|
|
11
|
+
* fields are DECLARED and surfaced to the user via HITL, with hard
|
|
12
|
+
* enforcement delegated to L2 (container/microVM) and L3 (WASM).
|
|
13
|
+
* - **L2 / L3 (future)**: network egress filtering, filesystem jails,
|
|
14
|
+
* subprocess blocking, and resource limits become enforced.
|
|
15
|
+
*
|
|
16
|
+
* Declaring a capability today (even before it is hard-enforced) is valuable:
|
|
17
|
+
* it makes the security posture visible, gives the user an informed consent
|
|
18
|
+
* prompt, and means the manifest format is stable when enforcement lands.
|
|
19
|
+
*/
|
|
20
|
+
/** How a server may reach the network. */
|
|
21
|
+
export type NetworkMode = "none" | "allowlist" | "all";
|
|
22
|
+
/** Enforcement level actually applied to a running connection. */
|
|
23
|
+
export type EnforcementLevel = "none" | "l1-process" | "l2-container" | "l3-wasm";
|
|
24
|
+
/** Environment-variable access policy. */
|
|
25
|
+
export interface EnvPolicy {
|
|
26
|
+
/**
|
|
27
|
+
* Explicit allowlist of environment variable NAMES the server may receive.
|
|
28
|
+
* Anything not listed is stripped before spawn. Example: ["GITHUB_TOKEN"].
|
|
29
|
+
*/
|
|
30
|
+
allow: string[];
|
|
31
|
+
/**
|
|
32
|
+
* When true, also inherit the SDK's safe default vars (PATH, HOME, etc.)
|
|
33
|
+
* needed for the process to start. The allowlist is layered on top.
|
|
34
|
+
*/
|
|
35
|
+
inheritDefaults: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** Network egress policy. */
|
|
38
|
+
export interface NetworkPolicy {
|
|
39
|
+
mode: NetworkMode;
|
|
40
|
+
/**
|
|
41
|
+
* Host:port patterns the server may reach when mode is "allowlist".
|
|
42
|
+
* Example: ["api.github.com:443", "*.githubusercontent.com:443"].
|
|
43
|
+
* Declared in L1; enforced in L2+.
|
|
44
|
+
*/
|
|
45
|
+
allow: string[];
|
|
46
|
+
}
|
|
47
|
+
/** Filesystem access policy. Declared in L1; enforced in L2+. */
|
|
48
|
+
export interface FilesystemPolicy {
|
|
49
|
+
/** Absolute paths (or globs) the server may read. */
|
|
50
|
+
read: string[];
|
|
51
|
+
/** Absolute paths (or globs) the server may write. */
|
|
52
|
+
write: string[];
|
|
53
|
+
}
|
|
54
|
+
/** Optional resource limits. Declared in L1; enforced in L2+. */
|
|
55
|
+
export interface ResourceLimits {
|
|
56
|
+
maxMemoryMb?: number;
|
|
57
|
+
maxCpuPercent?: number;
|
|
58
|
+
/** Wall-clock timeout for a single tool call, ms. */
|
|
59
|
+
toolCallTimeoutMs?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The complete capability contract for one downstream server.
|
|
63
|
+
*/
|
|
64
|
+
export interface CapabilityManifest {
|
|
65
|
+
/** Schema version for forward-compatibility. */
|
|
66
|
+
version: 1;
|
|
67
|
+
/** Server slug this manifest applies to. */
|
|
68
|
+
slug: string;
|
|
69
|
+
/** Enforcement level the gateway will actually apply. */
|
|
70
|
+
enforcement: EnforcementLevel;
|
|
71
|
+
env: EnvPolicy;
|
|
72
|
+
network: NetworkPolicy;
|
|
73
|
+
filesystem: FilesystemPolicy;
|
|
74
|
+
/** Whether the server may spawn subprocesses. Declared in L1; enforced L2+. */
|
|
75
|
+
subprocess: boolean;
|
|
76
|
+
limits?: ResourceLimits;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Human-readable summary of a manifest's notable grants, for display in the
|
|
80
|
+
* HITL confirmation prompt. Each entry is a short risk-relevant statement.
|
|
81
|
+
*/
|
|
82
|
+
export interface ManifestSummary {
|
|
83
|
+
enforcement: EnforcementLevel;
|
|
84
|
+
/** e.g. "Read 1 environment variable: GITHUB_TOKEN" */
|
|
85
|
+
lines: string[];
|
|
86
|
+
/** True if the manifest grants anything the user should scrutinize. */
|
|
87
|
+
hasSensitiveGrants: boolean;
|
|
88
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox capability model.
|
|
3
|
+
*
|
|
4
|
+
* A CapabilityManifest declares what a downstream MCP server is permitted to
|
|
5
|
+
* access. It is the security contract between the gateway and an untrusted
|
|
6
|
+
* server.
|
|
7
|
+
*
|
|
8
|
+
* Enforcement is layered:
|
|
9
|
+
* - **L1 (this release)**: environment-variable scoping is enforced at process
|
|
10
|
+
* spawn (cross-platform, in-process). Network / filesystem / subprocess
|
|
11
|
+
* fields are DECLARED and surfaced to the user via HITL, with hard
|
|
12
|
+
* enforcement delegated to L2 (container/microVM) and L3 (WASM).
|
|
13
|
+
* - **L2 / L3 (future)**: network egress filtering, filesystem jails,
|
|
14
|
+
* subprocess blocking, and resource limits become enforced.
|
|
15
|
+
*
|
|
16
|
+
* Declaring a capability today (even before it is hard-enforced) is valuable:
|
|
17
|
+
* it makes the security posture visible, gives the user an informed consent
|
|
18
|
+
* prompt, and means the manifest format is stable when enforcement lands.
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error classes for the MCP Gateway.
|
|
3
|
+
*/
|
|
4
|
+
export declare class GatewayError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
constructor(message: string, code: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class ConnectionError extends GatewayError {
|
|
9
|
+
readonly serverSlug: string;
|
|
10
|
+
constructor(message: string, serverSlug: string);
|
|
11
|
+
}
|
|
12
|
+
export declare class RegistryError extends GatewayError {
|
|
13
|
+
constructor(message: string);
|
|
14
|
+
}
|
|
15
|
+
export declare class TimeoutError extends GatewayError {
|
|
16
|
+
readonly serverSlug: string;
|
|
17
|
+
readonly timeoutMs: number;
|
|
18
|
+
constructor(message: string, serverSlug: string, timeoutMs: number);
|
|
19
|
+
}
|
|
20
|
+
export declare class MaxConnectionsError extends GatewayError {
|
|
21
|
+
readonly maxConnections: number;
|
|
22
|
+
constructor(maxConnections: number);
|
|
23
|
+
}
|
|
24
|
+
export declare class DuplicateConnectionError extends GatewayError {
|
|
25
|
+
readonly serverSlug: string;
|
|
26
|
+
constructor(serverSlug: string);
|
|
27
|
+
}
|
|
28
|
+
export declare class PermissionDeniedError extends GatewayError {
|
|
29
|
+
readonly serverSlug: string;
|
|
30
|
+
constructor(serverSlug: string, message?: string);
|
|
31
|
+
}
|
|
32
|
+
/** Format any error as an MCP tool error result */
|
|
33
|
+
export declare function toolError(message: string): {
|
|
34
|
+
content: {
|
|
35
|
+
type: "text";
|
|
36
|
+
text: string;
|
|
37
|
+
}[];
|
|
38
|
+
isError: boolean;
|
|
39
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error classes for the MCP Gateway.
|
|
3
|
+
*/
|
|
4
|
+
export class GatewayError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(message, code) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "GatewayError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class ConnectionError extends GatewayError {
|
|
13
|
+
serverSlug;
|
|
14
|
+
constructor(message, serverSlug) {
|
|
15
|
+
super(message, "CONNECTION_ERROR");
|
|
16
|
+
this.serverSlug = serverSlug;
|
|
17
|
+
this.name = "ConnectionError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class RegistryError extends GatewayError {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super(message, "REGISTRY_ERROR");
|
|
23
|
+
this.name = "RegistryError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class TimeoutError extends GatewayError {
|
|
27
|
+
serverSlug;
|
|
28
|
+
timeoutMs;
|
|
29
|
+
constructor(message, serverSlug, timeoutMs) {
|
|
30
|
+
super(message, "TIMEOUT_ERROR");
|
|
31
|
+
this.serverSlug = serverSlug;
|
|
32
|
+
this.timeoutMs = timeoutMs;
|
|
33
|
+
this.name = "TimeoutError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class MaxConnectionsError extends GatewayError {
|
|
37
|
+
maxConnections;
|
|
38
|
+
constructor(maxConnections) {
|
|
39
|
+
super(`Maximum connections (${maxConnections}) reached. Disconnect a server first.`, "MAX_CONNECTIONS");
|
|
40
|
+
this.maxConnections = maxConnections;
|
|
41
|
+
this.name = "MaxConnectionsError";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class DuplicateConnectionError extends GatewayError {
|
|
45
|
+
serverSlug;
|
|
46
|
+
constructor(serverSlug) {
|
|
47
|
+
super(`Server "${serverSlug}" is already connected.`, "DUPLICATE_CONNECTION");
|
|
48
|
+
this.serverSlug = serverSlug;
|
|
49
|
+
this.name = "DuplicateConnectionError";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class PermissionDeniedError extends GatewayError {
|
|
53
|
+
serverSlug;
|
|
54
|
+
constructor(serverSlug, message) {
|
|
55
|
+
super(message || `Connection to "${serverSlug}" was denied by trust policy.`, "PERMISSION_DENIED");
|
|
56
|
+
this.serverSlug = serverSlug;
|
|
57
|
+
this.name = "PermissionDeniedError";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Format any error as an MCP tool error result */
|
|
61
|
+
export function toolError(message) {
|
|
62
|
+
return {
|
|
63
|
+
content: [{ type: "text", text: message }],
|
|
64
|
+
isError: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACQ;IAA7C,YAAY,OAAe,EAAkB,IAAY;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAAQ;QAEvD,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAG7B;IAFlB,YACE,OAAe,EACC,UAAkB;QAElC,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAFnB,eAAU,GAAV,UAAU,CAAQ;QAGlC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,YAAY;IAG1B;IACA;IAHlB,YACE,OAAe,EACC,UAAkB,EAClB,SAAiB;QAEjC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAHhB,eAAU,GAAV,UAAU,CAAQ;QAClB,cAAS,GAAT,SAAS,CAAQ;QAGjC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACvB;IAA5B,YAA4B,cAAsB;QAChD,KAAK,CACH,wBAAwB,cAAc,uCAAuC,EAC7E,iBAAiB,CAClB,CAAC;QAJwB,mBAAc,GAAd,cAAc,CAAQ;QAKhD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,YAAY;IAC5B;IAA5B,YAA4B,UAAkB;QAC5C,KAAK,CACH,WAAW,UAAU,yBAAyB,EAC9C,sBAAsB,CACvB,CAAC;QAJwB,eAAU,GAAV,UAAU,CAAQ;QAK5C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IAEnC;IADlB,YACkB,UAAkB,EAClC,OAAgB;QAEhB,KAAK,CACH,OAAO,IAAI,kBAAkB,UAAU,+BAA+B,EACtE,mBAAmB,CACpB,CAAC;QANc,eAAU,GAAV,UAAU,CAAQ;QAOlC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,mDAAmD;AACnD,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stderr-only logger for the MCP Gateway.
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: All output MUST go to stderr because stdout is reserved
|
|
5
|
+
* for MCP JSON-RPC protocol messages. Writing anything else to stdout
|
|
6
|
+
* would corrupt the protocol stream.
|
|
7
|
+
*/
|
|
8
|
+
type LogLevel = "debug" | "info" | "warn" | "error";
|
|
9
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
10
|
+
export declare const log: {
|
|
11
|
+
debug(msg: string, data?: unknown): void;
|
|
12
|
+
info(msg: string, data?: unknown): void;
|
|
13
|
+
warn(msg: string, data?: unknown): void;
|
|
14
|
+
error(msg: string, data?: unknown): void;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stderr-only logger for the MCP Gateway.
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: All output MUST go to stderr because stdout is reserved
|
|
5
|
+
* for MCP JSON-RPC protocol messages. Writing anything else to stdout
|
|
6
|
+
* would corrupt the protocol stream.
|
|
7
|
+
*/
|
|
8
|
+
const LEVEL_ORDER = {
|
|
9
|
+
debug: 0,
|
|
10
|
+
info: 1,
|
|
11
|
+
warn: 2,
|
|
12
|
+
error: 3,
|
|
13
|
+
};
|
|
14
|
+
let currentLevel = "info";
|
|
15
|
+
export function setLogLevel(level) {
|
|
16
|
+
currentLevel = level;
|
|
17
|
+
}
|
|
18
|
+
function shouldLog(level) {
|
|
19
|
+
return LEVEL_ORDER[level] >= LEVEL_ORDER[currentLevel];
|
|
20
|
+
}
|
|
21
|
+
function formatMessage(level, msg, data) {
|
|
22
|
+
const ts = new Date().toISOString();
|
|
23
|
+
const prefix = `[${ts}] [${level.toUpperCase()}] [mcp-gateway]`;
|
|
24
|
+
if (data !== undefined) {
|
|
25
|
+
return `${prefix} ${msg} ${JSON.stringify(data)}\n`;
|
|
26
|
+
}
|
|
27
|
+
return `${prefix} ${msg}\n`;
|
|
28
|
+
}
|
|
29
|
+
export const log = {
|
|
30
|
+
debug(msg, data) {
|
|
31
|
+
if (shouldLog("debug")) {
|
|
32
|
+
process.stderr.write(formatMessage("debug", msg, data));
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
info(msg, data) {
|
|
36
|
+
if (shouldLog("info")) {
|
|
37
|
+
process.stderr.write(formatMessage("info", msg, data));
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
warn(msg, data) {
|
|
41
|
+
if (shouldLog("warn")) {
|
|
42
|
+
process.stderr.write(formatMessage("warn", msg, data));
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
error(msg, data) {
|
|
46
|
+
if (shouldLog("error")) {
|
|
47
|
+
process.stderr.write(formatMessage("error", msg, data));
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAa,MAAM,CAAC;AAEpC,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,GAAW,EAAE,IAAc;IACjE,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAChE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,MAAM,IAAI,GAAG,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,KAAK,CAAC,GAAW,EAAE,IAAc;QAC/B,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,IAAc;QAC9B,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,IAAc;QAC9B,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,IAAc;QAC/B,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mcp-rating/gateway",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "MCP Gateway — auto-discover, connect, and proxy MCP servers from any AI desktop client",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"mcp-gateway": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://mcprating.io/gateway",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/mcprating/platform.git",
|
|
19
|
+
"directory": "packages/gateway"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/mcprating/platform/issues"
|
|
23
|
+
},
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./server": {
|
|
33
|
+
"types": "./dist/gateway-server.d.ts",
|
|
34
|
+
"import": "./dist/gateway-server.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"mcp",
|
|
39
|
+
"model-context-protocol",
|
|
40
|
+
"gateway",
|
|
41
|
+
"proxy",
|
|
42
|
+
"mcp-server",
|
|
43
|
+
"mcp-rating",
|
|
44
|
+
"ai",
|
|
45
|
+
"tools"
|
|
46
|
+
],
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"author": "[YOUR FULL NAME]",
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=18.0.0"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
54
|
+
"eventsource": "^4.1.0",
|
|
55
|
+
"ws": "^8.19.0",
|
|
56
|
+
"zod": "^4.3.6"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/node": "^25.2.3",
|
|
60
|
+
"@types/ws": "^8.18.1",
|
|
61
|
+
"tsx": "^4.21.0",
|
|
62
|
+
"typescript": "^5.9.3"
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"build": "tsc",
|
|
66
|
+
"dev": "tsx watch src/index.ts",
|
|
67
|
+
"start": "node dist/index.js",
|
|
68
|
+
"start:daemon": "node dist/index.js",
|
|
69
|
+
"typecheck": "tsc --noEmit",
|
|
70
|
+
"test:e2e": "node --import tsx test-e2e.mjs"
|
|
71
|
+
}
|
|
72
|
+
}
|