@ni-c/mcp-hub 0.6.3 → 0.7.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/CHANGELOG.md +154 -0
- package/README.md +34 -6
- package/dist/auth/headers.js +33 -0
- package/dist/auth/headers.js.map +1 -0
- package/dist/auth/provider.js +4 -0
- package/dist/auth/provider.js.map +1 -1
- package/dist/auth/routes.js +4 -1
- package/dist/auth/routes.js.map +1 -1
- package/dist/auth/store.js +152 -35
- package/dist/auth/store.js.map +1 -1
- package/dist/config.js +209 -27
- package/dist/config.js.map +1 -1
- package/dist/docker-proxy/index.js +106 -0
- package/dist/docker-proxy/index.js.map +1 -0
- package/dist/docker-proxy/policy.js +278 -0
- package/dist/docker-proxy/policy.js.map +1 -0
- package/dist/docker-proxy/secrets.js +111 -0
- package/dist/docker-proxy/secrets.js.map +1 -0
- package/dist/docker-proxy/server.js +265 -0
- package/dist/docker-proxy/server.js.map +1 -0
- package/dist/health.js +11 -1
- package/dist/health.js.map +1 -1
- package/dist/hub.js +3 -6
- package/dist/hub.js.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-limits.js +69 -0
- package/dist/mcp-limits.js.map +1 -0
- package/dist/proxy.js +4 -5
- package/dist/proxy.js.map +1 -1
- package/dist/sandbox/container-spec.js +115 -0
- package/dist/sandbox/container-spec.js.map +1 -0
- package/dist/sandbox/docker-client.js +291 -0
- package/dist/sandbox/docker-client.js.map +1 -0
- package/dist/sandbox/policy-protocol.js +11 -0
- package/dist/sandbox/policy-protocol.js.map +1 -0
- package/dist/supervisor.js +90 -17
- package/dist/supervisor.js.map +1 -1
- package/dist/transports/docker.js +163 -0
- package/dist/transports/docker.js.map +1 -0
- package/dist/transports/socket.js +59 -0
- package/dist/transports/socket.js.map +1 -0
- package/dist/transports/stream.js +102 -0
- package/dist/transports/stream.js.map +1 -0
- package/package.json +8 -4
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The container a `type: "docker"` entry describes — derived from the config
|
|
3
|
+
* and from nothing else.
|
|
4
|
+
*
|
|
5
|
+
* This module is the reason the docker proxy can enforce a policy without a
|
|
6
|
+
* second policy file: the hub builds its create request here, and the proxy
|
|
7
|
+
* rebuilds the expected request from the same config with the same function
|
|
8
|
+
* and compares. Any field the hub adds, drops or changes on the way is a
|
|
9
|
+
* mismatch by construction, so the policy cannot drift from the code that
|
|
10
|
+
* sends the request.
|
|
11
|
+
*
|
|
12
|
+
* Everything that could only ever weaken the sandbox is fixed here rather than
|
|
13
|
+
* taken from the config: capabilities are always dropped, no-new-privileges is
|
|
14
|
+
* always set, privileged is always false, and there is never a restart policy
|
|
15
|
+
* (the hub supervises, and a Docker-level restart would resurrect a container
|
|
16
|
+
* whose stdio stream nobody is holding).
|
|
17
|
+
*/
|
|
18
|
+
export const CONTAINER_PREFIX = 'mcp-sandbox-';
|
|
19
|
+
export const OWNER_LABEL = 'io.mcp-hub.owner';
|
|
20
|
+
export const SERVER_LABEL = 'io.mcp-hub.server';
|
|
21
|
+
export const OWNER_VALUE = 'mcp-hub';
|
|
22
|
+
/** Watchtower would otherwise try to update images the hub pins deliberately. */
|
|
23
|
+
export const WATCHTOWER_LABEL = 'com.centurylinklabs.watchtower.enable';
|
|
24
|
+
/**
|
|
25
|
+
* Blanked, not set: an image built with `docker compose build` carries its
|
|
26
|
+
* project label, and a container inherits every label of its image. A sandbox
|
|
27
|
+
* would therefore look like part of that Compose project, and a `docker compose
|
|
28
|
+
* down` in the directory the image was built in would collect a container the
|
|
29
|
+
* hub owns and is holding the stdio of. An empty value matches no project.
|
|
30
|
+
*/
|
|
31
|
+
export const COMPOSE_PROJECT_LABEL = 'com.docker.compose.project';
|
|
32
|
+
const PORT_PATTERN = /^(?:(\d{1,3}(?:\.\d{1,3}){3}):)?(\d{1,5}):(\d{1,5})(?:\/(tcp|udp))?$/;
|
|
33
|
+
export function containerName(server) {
|
|
34
|
+
return `${CONTAINER_PREFIX}${server}`;
|
|
35
|
+
}
|
|
36
|
+
/** `mcp-sandbox-scraper` -> `scraper`; undefined for anything outside our namespace. */
|
|
37
|
+
export function serverNameFromContainer(container) {
|
|
38
|
+
const name = container.startsWith('/') ? container.slice(1) : container;
|
|
39
|
+
if (!name.startsWith(CONTAINER_PREFIX))
|
|
40
|
+
return undefined;
|
|
41
|
+
const server = name.slice(CONTAINER_PREFIX.length);
|
|
42
|
+
return /^[a-zA-Z0-9_-]+$/.test(server) ? server : undefined;
|
|
43
|
+
}
|
|
44
|
+
function portBindings(ports) {
|
|
45
|
+
const exposed = {};
|
|
46
|
+
const bindings = {};
|
|
47
|
+
for (const port of ports) {
|
|
48
|
+
const match = PORT_PATTERN.exec(port);
|
|
49
|
+
if (!match)
|
|
50
|
+
throw new Error(`invalid port mapping "${port}"`); // parseConfig rejects these first
|
|
51
|
+
const [, hostIp, hostPort, containerPort, proto] = match;
|
|
52
|
+
const key = `${containerPort}/${proto ?? 'tcp'}`;
|
|
53
|
+
exposed[key] = {};
|
|
54
|
+
(bindings[key] ??= []);
|
|
55
|
+
bindings[key].push({ HostIp: hostIp ?? '127.0.0.1', HostPort: hostPort });
|
|
56
|
+
}
|
|
57
|
+
return { exposed, bindings };
|
|
58
|
+
}
|
|
59
|
+
function tmpfsMounts(tmpfs) {
|
|
60
|
+
return Object.fromEntries(tmpfs.map(entry => {
|
|
61
|
+
const separator = entry.indexOf(':');
|
|
62
|
+
if (separator === -1)
|
|
63
|
+
return [entry, 'rw,nosuid,nodev,size=64m'];
|
|
64
|
+
return [entry.slice(0, separator), entry.slice(separator + 1)];
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
export function buildCreateRequest(server, config) {
|
|
68
|
+
const { exposed, bindings } = portBindings(config.ports);
|
|
69
|
+
const body = {
|
|
70
|
+
Image: config.image,
|
|
71
|
+
// stdio is the whole point: keep stdin open for the life of the container
|
|
72
|
+
// and never allocate a TTY, because a TTY merges stdout and stderr into one
|
|
73
|
+
// unframed stream and the protocol would drown in the server's log lines.
|
|
74
|
+
OpenStdin: true,
|
|
75
|
+
StdinOnce: false,
|
|
76
|
+
AttachStdin: true,
|
|
77
|
+
AttachStdout: true,
|
|
78
|
+
AttachStderr: true,
|
|
79
|
+
Tty: false,
|
|
80
|
+
Env: Object.entries(config.env).map(([key, value]) => `${key}=${value}`),
|
|
81
|
+
Labels: {
|
|
82
|
+
[OWNER_LABEL]: OWNER_VALUE,
|
|
83
|
+
[SERVER_LABEL]: server,
|
|
84
|
+
[WATCHTOWER_LABEL]: 'false',
|
|
85
|
+
[COMPOSE_PROJECT_LABEL]: ''
|
|
86
|
+
},
|
|
87
|
+
HostConfig: {
|
|
88
|
+
// The hub removes the container itself on close; AutoRemove covers the
|
|
89
|
+
// case where the server exits on its own.
|
|
90
|
+
AutoRemove: true,
|
|
91
|
+
Binds: [...config.volumes],
|
|
92
|
+
PortBindings: bindings,
|
|
93
|
+
NetworkMode: config.network,
|
|
94
|
+
ReadonlyRootfs: config.readOnly,
|
|
95
|
+
Tmpfs: tmpfsMounts(config.tmpfs),
|
|
96
|
+
CapDrop: ['ALL'],
|
|
97
|
+
CapAdd: [],
|
|
98
|
+
Privileged: false,
|
|
99
|
+
SecurityOpt: ['no-new-privileges:true'],
|
|
100
|
+
RestartPolicy: { Name: '' },
|
|
101
|
+
// stdout carries the protocol, so a log driver that keeps every byte of
|
|
102
|
+
// it would fill the disk with a transcript of the session.
|
|
103
|
+
LogConfig: { Type: 'json-file', Config: { 'max-size': '1m', 'max-file': '1' } },
|
|
104
|
+
Memory: config.memory,
|
|
105
|
+
PidsLimit: config.pidsLimit,
|
|
106
|
+
NanoCpus: Math.round(config.cpus * 1_000_000_000)
|
|
107
|
+
},
|
|
108
|
+
...(Object.keys(exposed).length > 0 ? { ExposedPorts: exposed } : {}),
|
|
109
|
+
...(config.command !== undefined ? { Cmd: config.command } : {}),
|
|
110
|
+
...(config.entrypoint !== undefined ? { Entrypoint: config.entrypoint } : {}),
|
|
111
|
+
...(config.user !== undefined ? { User: config.user } : {})
|
|
112
|
+
};
|
|
113
|
+
return { name: containerName(server), body };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=container-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-spec.js","sourceRoot":"","sources":["../../src/sandbox/container-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { OWNER_LABEL, OWNER_VALUE, serverNameFromContainer } from './container-spec.js';
|
|
3
|
+
import { DOCKER_POLICY_NAME, DOCKER_POLICY_PATH, DOCKER_POLICY_VERSION } from './policy-protocol.js';
|
|
4
|
+
/**
|
|
5
|
+
* The slice of the Docker Engine API the hub needs, over a Unix socket or TCP.
|
|
6
|
+
*
|
|
7
|
+
* Deliberately hand-rolled instead of pulling in dockerode: the hub is meant
|
|
8
|
+
* to be small enough to audit and to run on a Pi, and everything used here is
|
|
9
|
+
* five endpoints plus one connection upgrade. The upgrade is the interesting
|
|
10
|
+
* part — `POST /containers/{id}/attach` hands back the raw connection, and
|
|
11
|
+
* that connection is the container's stdio.
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_SOCKET = '/var/run/docker.sock';
|
|
14
|
+
/** Highest API version this client was written against; older daemons win. */
|
|
15
|
+
const MAX_API_VERSION = '1.44';
|
|
16
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
17
|
+
const PULL_TIMEOUT_MS = 15 * 60_000;
|
|
18
|
+
const MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
19
|
+
export class DockerError extends Error {
|
|
20
|
+
status;
|
|
21
|
+
constructor(message, status) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.status = status;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** `unix:///var/run/docker.sock`, `/var/run/docker.sock` or `tcp://host:2375`. */
|
|
27
|
+
export function parseDockerHost(value) {
|
|
28
|
+
if (!value || value.length === 0)
|
|
29
|
+
return { socketPath: DEFAULT_SOCKET };
|
|
30
|
+
if (value.startsWith('/'))
|
|
31
|
+
return { socketPath: value };
|
|
32
|
+
if (value.startsWith('unix://'))
|
|
33
|
+
return { socketPath: value.slice('unix://'.length) };
|
|
34
|
+
if (value.startsWith('tcp://') || value.startsWith('http://')) {
|
|
35
|
+
const url = new URL(value.replace(/^tcp:\/\//, 'http://'));
|
|
36
|
+
return { host: url.hostname, port: Number(url.port || 2375) };
|
|
37
|
+
}
|
|
38
|
+
throw new Error(`DOCKER_HOST must be a unix:// path or a tcp:// address, got "${value}"`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Docker sandboxing is safe only through the matching policy proxy. An absent
|
|
42
|
+
* variable used to fall back to the root-equivalent daemon socket; refuse that
|
|
43
|
+
* configuration before making any request.
|
|
44
|
+
*/
|
|
45
|
+
export function parseSandboxDockerHost(value) {
|
|
46
|
+
if (!value)
|
|
47
|
+
throw new Error('DOCKER_HOST is required for docker servers and must point to the mcp-hub Docker policy proxy');
|
|
48
|
+
const endpoint = parseDockerHost(value);
|
|
49
|
+
if (endpoint.socketPath === DEFAULT_SOCKET) {
|
|
50
|
+
throw new Error('DOCKER_HOST points directly at /var/run/docker.sock; use the mcp-hub Docker policy proxy socket');
|
|
51
|
+
}
|
|
52
|
+
return endpoint;
|
|
53
|
+
}
|
|
54
|
+
function compareApiVersions(a, b) {
|
|
55
|
+
const [aMajor = 0, aMinor = 0] = a.split('.').map(Number);
|
|
56
|
+
const [bMajor = 0, bMinor = 0] = b.split('.').map(Number);
|
|
57
|
+
return aMajor - bMajor || aMinor - bMinor;
|
|
58
|
+
}
|
|
59
|
+
export function splitImageRef(ref) {
|
|
60
|
+
const at = ref.indexOf('@');
|
|
61
|
+
if (at !== -1)
|
|
62
|
+
return { fromImage: ref.slice(0, at), tag: ref.slice(at + 1) };
|
|
63
|
+
const slash = ref.lastIndexOf('/');
|
|
64
|
+
const colon = ref.lastIndexOf(':');
|
|
65
|
+
if (colon > slash)
|
|
66
|
+
return { fromImage: ref.slice(0, colon), tag: ref.slice(colon + 1) };
|
|
67
|
+
return { fromImage: ref, tag: 'latest' };
|
|
68
|
+
}
|
|
69
|
+
export class DockerClient {
|
|
70
|
+
endpoint;
|
|
71
|
+
apiVersion;
|
|
72
|
+
policyVerified = false;
|
|
73
|
+
constructor(endpoint = { socketPath: DEFAULT_SOCKET }) {
|
|
74
|
+
this.endpoint = endpoint;
|
|
75
|
+
}
|
|
76
|
+
describe() {
|
|
77
|
+
return this.endpoint.socketPath ?? `${this.endpoint.host}:${this.endpoint.port}`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Pin the API version once per process. Unversioned requests are served by
|
|
81
|
+
* whatever the daemon currently defaults to, which is a moving target for a
|
|
82
|
+
* client that hard-codes field names.
|
|
83
|
+
*/
|
|
84
|
+
async version() {
|
|
85
|
+
if (this.apiVersion)
|
|
86
|
+
return this.apiVersion;
|
|
87
|
+
await this.verifyPolicyProxy();
|
|
88
|
+
const info = await this.send('GET', '/version', { versioned: false });
|
|
89
|
+
const daemon = info?.ApiVersion ?? MAX_API_VERSION;
|
|
90
|
+
this.apiVersion = compareApiVersions(daemon, MAX_API_VERSION) < 0 ? daemon : MAX_API_VERSION;
|
|
91
|
+
return this.apiVersion;
|
|
92
|
+
}
|
|
93
|
+
async verifyPolicyProxy() {
|
|
94
|
+
if (this.policyVerified)
|
|
95
|
+
return;
|
|
96
|
+
let handshake;
|
|
97
|
+
try {
|
|
98
|
+
handshake = await this.send('GET', DOCKER_POLICY_PATH, { versioned: false });
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw new DockerError(`Docker endpoint ${this.describe()} is not a reachable mcp-hub policy proxy: ${error.message}`, error.status);
|
|
102
|
+
}
|
|
103
|
+
if (handshake?.name !== DOCKER_POLICY_NAME || handshake.daemon !== 'ok') {
|
|
104
|
+
throw new DockerError(`Docker endpoint ${this.describe()} did not return a valid policy handshake`);
|
|
105
|
+
}
|
|
106
|
+
if (handshake.policyVersion !== DOCKER_POLICY_VERSION) {
|
|
107
|
+
throw new DockerError(`Docker policy version mismatch: hub requires ${DOCKER_POLICY_VERSION}, proxy provides ${String(handshake.policyVersion)}`);
|
|
108
|
+
}
|
|
109
|
+
this.policyVerified = true;
|
|
110
|
+
}
|
|
111
|
+
async path(path, query) {
|
|
112
|
+
const search = query ? `?${new URLSearchParams(query).toString()}` : '';
|
|
113
|
+
return `/v${await this.version()}${path}${search}`;
|
|
114
|
+
}
|
|
115
|
+
connectionOptions() {
|
|
116
|
+
return this.endpoint.socketPath ? { socketPath: this.endpoint.socketPath } : { host: this.endpoint.host, port: this.endpoint.port };
|
|
117
|
+
}
|
|
118
|
+
send(method, path, options = {}) {
|
|
119
|
+
const payload = options.body === undefined ? undefined : Buffer.from(JSON.stringify(options.body), 'utf8');
|
|
120
|
+
return new Promise((resolve, reject) => {
|
|
121
|
+
const request = http.request({
|
|
122
|
+
...this.connectionOptions(),
|
|
123
|
+
method,
|
|
124
|
+
path,
|
|
125
|
+
headers: {
|
|
126
|
+
Host: 'docker',
|
|
127
|
+
'Content-Type': 'application/json',
|
|
128
|
+
...(payload ? { 'Content-Length': String(payload.length) } : {})
|
|
129
|
+
}
|
|
130
|
+
}, response => {
|
|
131
|
+
const chunks = [];
|
|
132
|
+
let size = 0;
|
|
133
|
+
response.on('data', (chunk) => {
|
|
134
|
+
size += chunk.length;
|
|
135
|
+
if (size > MAX_RESPONSE_BYTES) {
|
|
136
|
+
response.destroy();
|
|
137
|
+
reject(new DockerError(`response from ${method} ${path} exceeded ${MAX_RESPONSE_BYTES} bytes`));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
chunks.push(chunk);
|
|
141
|
+
});
|
|
142
|
+
response.on('end', () => {
|
|
143
|
+
const text = Buffer.concat(chunks).toString('utf8');
|
|
144
|
+
const status = response.statusCode ?? 0;
|
|
145
|
+
if (status >= 400) {
|
|
146
|
+
let message = text.slice(0, 500);
|
|
147
|
+
try {
|
|
148
|
+
message = JSON.parse(text).message ?? message;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Not JSON; the raw body is the best message we have.
|
|
152
|
+
}
|
|
153
|
+
reject(new DockerError(`${method} ${path}: ${status} ${message}`, status));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (options.expectStream) {
|
|
157
|
+
// Progress streams (image pull) report failures inside the body
|
|
158
|
+
// with a 200 status, so the status code alone means nothing.
|
|
159
|
+
const failure = text
|
|
160
|
+
.split('\n')
|
|
161
|
+
.filter(Boolean)
|
|
162
|
+
.map(line => {
|
|
163
|
+
try {
|
|
164
|
+
return JSON.parse(line);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return {};
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
.find(entry => entry.error);
|
|
171
|
+
if (failure?.error) {
|
|
172
|
+
reject(new DockerError(`${method} ${path}: ${failure.error}`));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
resolve(undefined);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (text.length === 0) {
|
|
179
|
+
resolve(undefined);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
resolve(JSON.parse(text));
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
reject(new DockerError(`${method} ${path}: response is not JSON`));
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
request.setTimeout(options.timeoutMs ?? REQUEST_TIMEOUT_MS, () => {
|
|
191
|
+
request.destroy(new DockerError(`${method} ${path}: timed out`));
|
|
192
|
+
});
|
|
193
|
+
request.on('error', error => reject(new DockerError(`${method} ${path}: ${error.message}`)));
|
|
194
|
+
if (payload)
|
|
195
|
+
request.write(payload);
|
|
196
|
+
request.end();
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async ping() {
|
|
200
|
+
await this.version();
|
|
201
|
+
}
|
|
202
|
+
async createContainer(name, body) {
|
|
203
|
+
const created = await this.send('POST', await this.path('/containers/create', { name }), { body });
|
|
204
|
+
return created.Id;
|
|
205
|
+
}
|
|
206
|
+
async startContainer(id) {
|
|
207
|
+
await this.send('POST', await this.path(`/containers/${encodeURIComponent(id)}/start`));
|
|
208
|
+
}
|
|
209
|
+
async removeContainer(id) {
|
|
210
|
+
try {
|
|
211
|
+
await this.send('DELETE', await this.path(`/containers/${encodeURIComponent(id)}`, { force: '1', v: '0' }));
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
// 404 (already gone) and 409 (removal already in progress, which is what
|
|
215
|
+
// AutoRemove looks like from here) are the normal endings, not failures.
|
|
216
|
+
const status = error.status;
|
|
217
|
+
if (status !== 404 && status !== 409)
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async imageExists(ref) {
|
|
222
|
+
try {
|
|
223
|
+
await this.send('GET', await this.path(`/images/${encodeURIComponent(ref)}/json`));
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
if (error.status === 404)
|
|
228
|
+
return false;
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async pullImage(ref) {
|
|
233
|
+
const { fromImage, tag } = splitImageRef(ref);
|
|
234
|
+
await this.send('POST', await this.path('/images/create', { fromImage, tag }), {
|
|
235
|
+
expectStream: true,
|
|
236
|
+
timeoutMs: PULL_TIMEOUT_MS
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/** Containers this hub created, whether running or not. */
|
|
240
|
+
async listOwnedContainers() {
|
|
241
|
+
const filters = JSON.stringify({ label: [`${OWNER_LABEL}=${OWNER_VALUE}`] });
|
|
242
|
+
const containers = await this.send('GET', await this.path('/containers/json', { all: '1', filters }));
|
|
243
|
+
return (containers ?? []).map(container => {
|
|
244
|
+
const name = (container.Names?.[0] ?? '').replace(/^\//, '');
|
|
245
|
+
return { id: container.Id, name, server: serverNameFromContainer(name) };
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Attach to a container's stdio and return the raw connection.
|
|
250
|
+
*
|
|
251
|
+
* Docker answers `101 UPGRADED` and then hands over the socket, so this has
|
|
252
|
+
* to go through Node's upgrade event rather than a normal response. Bytes
|
|
253
|
+
* that arrived in the same packet as the headers are unshifted back, or the
|
|
254
|
+
* first protocol frame would be lost.
|
|
255
|
+
*/
|
|
256
|
+
async attach(id) {
|
|
257
|
+
const path = await this.path(`/containers/${encodeURIComponent(id)}/attach`, {
|
|
258
|
+
stream: '1',
|
|
259
|
+
stdin: '1',
|
|
260
|
+
stdout: '1',
|
|
261
|
+
stderr: '1'
|
|
262
|
+
});
|
|
263
|
+
return new Promise((resolve, reject) => {
|
|
264
|
+
const request = http.request({
|
|
265
|
+
...this.connectionOptions(),
|
|
266
|
+
method: 'POST',
|
|
267
|
+
path,
|
|
268
|
+
headers: {
|
|
269
|
+
Host: 'docker',
|
|
270
|
+
'Content-Type': 'application/json',
|
|
271
|
+
Connection: 'Upgrade',
|
|
272
|
+
Upgrade: 'tcp'
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
request.on('upgrade', (_response, socket, head) => {
|
|
276
|
+
if (head?.length)
|
|
277
|
+
socket.unshift(head);
|
|
278
|
+
socket.setTimeout(0);
|
|
279
|
+
resolve(socket);
|
|
280
|
+
});
|
|
281
|
+
request.on('response', response => {
|
|
282
|
+
response.resume();
|
|
283
|
+
reject(new DockerError(`attach to ${id}: daemon answered ${response.statusCode} instead of upgrading`, response.statusCode));
|
|
284
|
+
});
|
|
285
|
+
request.on('error', error => reject(new DockerError(`attach to ${id}: ${error.message}`)));
|
|
286
|
+
request.setTimeout(REQUEST_TIMEOUT_MS, () => request.destroy(new DockerError(`attach to ${id}: timed out`)));
|
|
287
|
+
request.end();
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=docker-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-client.js","sourceRoot":"","sources":["../../src/sandbox/docker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire contract between the internet-facing hub and the Docker policy proxy.
|
|
3
|
+
*
|
|
4
|
+
* Bump this whenever either side changes the meaning of an allowed Docker
|
|
5
|
+
* request. A release version is deliberately not used: patch releases that do
|
|
6
|
+
* not change the policy remain interoperable, while policy drift fails closed.
|
|
7
|
+
*/
|
|
8
|
+
export const DOCKER_POLICY_VERSION = 1;
|
|
9
|
+
export const DOCKER_POLICY_PATH = '/_mcp_hub/policy';
|
|
10
|
+
export const DOCKER_POLICY_NAME = 'mcp-hub-docker-proxy';
|
|
11
|
+
//# sourceMappingURL=policy-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-protocol.js","sourceRoot":"","sources":["../../src/sandbox/policy-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AACrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC"}
|
package/dist/supervisor.js
CHANGED
|
@@ -3,7 +3,11 @@ import { StdioClientTransport, getDefaultEnvironment } from '@modelcontextprotoc
|
|
|
3
3
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
4
|
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
5
5
|
import { VERSION } from './version.js';
|
|
6
|
+
import { MAX_TOOL_LIST_PAGES, MAX_TOOLS, MAX_TOOL_METADATA_BYTES, jsonSize } from './mcp-limits.js';
|
|
6
7
|
import { ToolListChangedNotificationSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
import { SocketTransport } from './transports/socket.js';
|
|
9
|
+
import { DockerTransport } from './transports/docker.js';
|
|
10
|
+
import { DockerClient, parseSandboxDockerHost } from './sandbox/docker-client.js';
|
|
7
11
|
/**
|
|
8
12
|
* Remote upstreams get their configured headers on EVERY request via a fetch
|
|
9
13
|
* wrapper — requestInit alone does not cover the SSE stream GET.
|
|
@@ -24,11 +28,47 @@ function buildRemoteTransport(config) {
|
|
|
24
28
|
}
|
|
25
29
|
return new StreamableHTTPClientTransport(url, { requestInit: { headers }, fetch: fetchWithHeaders });
|
|
26
30
|
}
|
|
31
|
+
let sharedDockerClient;
|
|
32
|
+
/**
|
|
33
|
+
* One Docker connection for the whole hub, pointed at DOCKER_HOST — which in
|
|
34
|
+
* the documented deployment is not the daemon but the policy proxy's socket.
|
|
35
|
+
*/
|
|
36
|
+
export function dockerClient() {
|
|
37
|
+
return (sharedDockerClient ??= new DockerClient(parseSandboxDockerHost(process.env.DOCKER_HOST)));
|
|
38
|
+
}
|
|
39
|
+
/** Tests inject a stub here; passing undefined restores the DOCKER_HOST client. */
|
|
40
|
+
export function setDockerClient(client) {
|
|
41
|
+
sharedDockerClient = client;
|
|
42
|
+
}
|
|
27
43
|
const BACKOFF_INITIAL_MS = 1_000;
|
|
28
44
|
const BACKOFF_MAX_MS = 5 * 60_000;
|
|
29
45
|
const BACKOFF_RESET_AFTER_MS = 5 * 60_000;
|
|
30
46
|
const PING_INTERVAL_MS = 60_000;
|
|
31
47
|
const PING_TIMEOUT_MS = 30_000;
|
|
48
|
+
export async function listAllTools(client) {
|
|
49
|
+
const tools = [];
|
|
50
|
+
let cursor;
|
|
51
|
+
let pages = 0;
|
|
52
|
+
let metadataBytes = 0;
|
|
53
|
+
const seenCursors = new Set();
|
|
54
|
+
do {
|
|
55
|
+
if (++pages > MAX_TOOL_LIST_PAGES)
|
|
56
|
+
throw new Error(`tools/list exceeded ${MAX_TOOL_LIST_PAGES} pages`);
|
|
57
|
+
const page = await client.listTools({ cursor });
|
|
58
|
+
metadataBytes += jsonSize(page.tools);
|
|
59
|
+
if (metadataBytes > MAX_TOOL_METADATA_BYTES)
|
|
60
|
+
throw new Error(`tools/list metadata exceeded ${MAX_TOOL_METADATA_BYTES} bytes`);
|
|
61
|
+
tools.push(...page.tools);
|
|
62
|
+
if (tools.length > MAX_TOOLS)
|
|
63
|
+
throw new Error(`tools/list exceeded ${MAX_TOOLS} tools`);
|
|
64
|
+
cursor = page.nextCursor;
|
|
65
|
+
if (cursor && seenCursors.has(cursor))
|
|
66
|
+
throw new Error('tools/list repeated a pagination cursor');
|
|
67
|
+
if (cursor)
|
|
68
|
+
seenCursors.add(cursor);
|
|
69
|
+
} while (cursor);
|
|
70
|
+
return tools;
|
|
71
|
+
}
|
|
32
72
|
export class ManagedServer {
|
|
33
73
|
name;
|
|
34
74
|
config;
|
|
@@ -49,22 +89,41 @@ export class ManagedServer {
|
|
|
49
89
|
this.config = config;
|
|
50
90
|
}
|
|
51
91
|
buildTransport() {
|
|
52
|
-
|
|
53
|
-
|
|
92
|
+
switch (this.config.kind) {
|
|
93
|
+
case 'remote':
|
|
94
|
+
return buildRemoteTransport(this.config);
|
|
95
|
+
case 'socket':
|
|
96
|
+
return new SocketTransport(this.config);
|
|
97
|
+
case 'docker':
|
|
98
|
+
return new DockerTransport(this.name, this.config, dockerClient());
|
|
99
|
+
case 'stdio':
|
|
100
|
+
return new StdioClientTransport({
|
|
101
|
+
command: this.config.command,
|
|
102
|
+
args: this.config.args,
|
|
103
|
+
env: { ...getDefaultEnvironment(), ...this.config.env },
|
|
104
|
+
stderr: 'inherit'
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** What "it went away" means for this kind of server, in the operator's words. */
|
|
109
|
+
exitReason() {
|
|
110
|
+
switch (this.config.kind) {
|
|
111
|
+
case 'remote':
|
|
112
|
+
return 'connection closed';
|
|
113
|
+
case 'socket':
|
|
114
|
+
return 'socket closed';
|
|
115
|
+
case 'docker':
|
|
116
|
+
return 'container exited';
|
|
117
|
+
case 'stdio':
|
|
118
|
+
return 'child process exited';
|
|
54
119
|
}
|
|
55
|
-
return new StdioClientTransport({
|
|
56
|
-
command: this.config.command,
|
|
57
|
-
args: this.config.args,
|
|
58
|
-
env: { ...getDefaultEnvironment(), ...this.config.env },
|
|
59
|
-
stderr: 'inherit'
|
|
60
|
-
});
|
|
61
120
|
}
|
|
62
121
|
async start() {
|
|
63
122
|
this.stopping = false;
|
|
64
123
|
this.state = 'starting';
|
|
65
124
|
const transport = this.buildTransport();
|
|
66
125
|
const client = new Client({ name: 'mcp-hub', version: VERSION }, { capabilities: {} });
|
|
67
|
-
transport.onclose = () => this.onExit(this.
|
|
126
|
+
transport.onclose = () => this.onExit(this.exitReason());
|
|
68
127
|
try {
|
|
69
128
|
await client.connect(transport);
|
|
70
129
|
}
|
|
@@ -92,14 +151,7 @@ export class ManagedServer {
|
|
|
92
151
|
if (!client)
|
|
93
152
|
return;
|
|
94
153
|
try {
|
|
95
|
-
|
|
96
|
-
let cursor;
|
|
97
|
-
do {
|
|
98
|
-
const page = await client.listTools({ cursor });
|
|
99
|
-
tools.push(...page.tools);
|
|
100
|
-
cursor = page.nextCursor;
|
|
101
|
-
} while (cursor);
|
|
102
|
-
this.tools = tools;
|
|
154
|
+
this.tools = await listAllTools(client);
|
|
103
155
|
}
|
|
104
156
|
catch (error) {
|
|
105
157
|
console.error(`[${this.name}] failed to list tools: ${error.message}`);
|
|
@@ -191,6 +243,27 @@ export class Supervisor {
|
|
|
191
243
|
async waitUntilSettled() {
|
|
192
244
|
await Promise.all(this.initialStarts);
|
|
193
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Remove sandbox containers this hub owns that no longer have a config entry.
|
|
248
|
+
*
|
|
249
|
+
* AutoRemove only fires when a container stops, so an unclean hub exit — or
|
|
250
|
+
* a server deleted from the config while the hub was down — leaves a
|
|
251
|
+
* container running with nobody holding its stdio. Containers of *active*
|
|
252
|
+
* servers are left alone here; DockerTransport.start() replaces those by
|
|
253
|
+
* name anyway.
|
|
254
|
+
*/
|
|
255
|
+
async reapOrphans() {
|
|
256
|
+
const active = new Set([...this.config.entries()].filter(([, cfg]) => cfg.kind === 'docker').map(([name]) => name));
|
|
257
|
+
if (active.size === 0)
|
|
258
|
+
return; // never touch Docker for a hub that does not use it
|
|
259
|
+
const owned = await dockerClient().listOwnedContainers();
|
|
260
|
+
for (const container of owned) {
|
|
261
|
+
if (container.server !== undefined && active.has(container.server))
|
|
262
|
+
continue;
|
|
263
|
+
console.log(`mcp-hub: removing orphaned sandbox container ${container.name}`);
|
|
264
|
+
await dockerClient().removeContainer(container.name);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
194
267
|
get(name) {
|
|
195
268
|
return this.servers.get(name);
|
|
196
269
|
}
|
package/dist/supervisor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
|