@autopo/mcp 0.4.4 → 0.5.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/dist/api.d.ts +5 -0
- package/dist/api.js +28 -3
- package/dist/api.js.map +1 -1
- package/dist/apps.d.ts +3 -2
- package/dist/apps.js +50 -17
- package/dist/apps.js.map +1 -1
- package/dist/calllog.js +12 -3
- package/dist/calllog.js.map +1 -1
- package/dist/cli.js +28 -7
- package/dist/cli.js.map +1 -1
- package/dist/files.d.ts +9 -3
- package/dist/files.js +96 -49
- package/dist/files.js.map +1 -1
- package/dist/http.d.ts +11 -1
- package/dist/http.js +128 -15
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/kit.d.ts +17 -2
- package/dist/kit.js +52 -19
- package/dist/kit.js.map +1 -1
- package/dist/net.d.ts +23 -0
- package/dist/net.js +142 -0
- package/dist/net.js.map +1 -0
- package/dist/resources.js +1 -1
- package/dist/resources.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +4 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/company.js +28 -10
- package/dist/tools/company.js.map +1 -1
- package/dist/tools/marketing.js +25 -8
- package/dist/tools/marketing.js.map +1 -1
- package/dist/tools/studio.js +55 -19
- package/dist/tools/studio.js.map +1 -1
- package/dist/zip.d.ts +2 -0
- package/dist/zip.js +24 -4
- package/dist/zip.js.map +1 -1
- package/package.json +9 -7
package/dist/files.js
CHANGED
|
@@ -3,25 +3,41 @@
|
|
|
3
3
|
* can take paths: the server reads them itself and uploads in 8 MB chunks through the Studio's upload API, the same
|
|
4
4
|
* way the web app does. Hosted, it takes URLs. Nothing travels through the MCP connection, which carries only JSON.
|
|
5
5
|
*/
|
|
6
|
-
import { open, readdir, readFile, stat } from 'node:fs/promises';
|
|
6
|
+
import { open, readdir, readFile, realpath, stat } from 'node:fs/promises';
|
|
7
7
|
import { homedir } from 'node:os';
|
|
8
|
-
import { basename, extname, join, relative, resolve } from 'node:path';
|
|
8
|
+
import { basename, dirname, extname, join, relative, resolve } from 'node:path';
|
|
9
9
|
import { ApiError } from './api.js';
|
|
10
10
|
import { ToolError } from './kit.js';
|
|
11
|
+
import { fetchPublic, readCapped } from './net.js';
|
|
11
12
|
import { bufferRange, handleRange, isZip, zipDataOffset, zipEntries, zipRead } from './zip.js';
|
|
12
13
|
export const MEDIA_TYPES = {
|
|
13
|
-
'.mp4': 'video/mp4', '.m4v': 'video/mp4', '.mov': 'video/quicktime', '.webm': 'video/webm', '.mkv': 'video/x-matroska', '.avi': 'video/x-msvideo',
|
|
14
|
-
'.mp3': 'audio/mpeg', '.wav': 'audio/wav', '.m4a': 'audio/mp4', '.aac': 'audio/aac', '.ogg': 'audio/ogg', '.flac': 'audio/flac', '.aif': 'audio/aiff', '.aiff': 'audio/aiff',
|
|
14
|
+
'.mp4': 'video/mp4', '.m4v': 'video/mp4', '.mov': 'video/quicktime', '.webm': 'video/webm', '.mkv': 'video/x-matroska', '.avi': 'video/x-msvideo', '.mpg': 'video/mpeg', '.mpeg': 'video/mpeg', '.3gp': 'video/3gpp', '.ogv': 'video/ogg',
|
|
15
|
+
'.mp3': 'audio/mpeg', '.wav': 'audio/wav', '.m4a': 'audio/mp4', '.aac': 'audio/aac', '.ogg': 'audio/ogg', '.oga': 'audio/ogg', '.opus': 'audio/opus', '.flac': 'audio/flac', '.aif': 'audio/aiff', '.aiff': 'audio/aiff',
|
|
15
16
|
'.png': 'image/png', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.webp': 'image/webp', '.gif': 'image/gif', '.heic': 'image/heic', '.avif': 'image/avif', '.bmp': 'image/bmp', '.tif': 'image/tiff', '.tiff': 'image/tiff',
|
|
16
17
|
};
|
|
17
18
|
export function mediaType(name) {
|
|
18
19
|
return MEDIA_TYPES[extname(name).toLowerCase()];
|
|
19
20
|
}
|
|
20
21
|
const MAX_IN_MEMORY = 512 * 1024 * 1024;
|
|
22
|
+
const MAX_PLAN_BYTES = 16 * 1024 * 1024;
|
|
23
|
+
/** A plan.json in a large folder (a home directory, say) must not walk all of it. */
|
|
24
|
+
const MAX_WALK_FILES = 5000;
|
|
25
|
+
const MAX_WALK_DEPTH = 8;
|
|
21
26
|
export function expandHome(path) {
|
|
22
27
|
return path.replace(/^~(?=$|\/)/, homedir());
|
|
23
28
|
}
|
|
24
29
|
const byName = (a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
|
|
30
|
+
/**
|
|
31
|
+
* Only pictures, clips and audio leave the machine, judged on the file a path really is: a link named holiday.mp4 that
|
|
32
|
+
* points at a key file is the key file. The path comes from the model, so this and the person's dialog (`confirmUpload`)
|
|
33
|
+
* are what stand between a prompt injection and their disk.
|
|
34
|
+
*/
|
|
35
|
+
async function mediaFile(path, full) {
|
|
36
|
+
const real = await realpath(full);
|
|
37
|
+
if (!mediaType(real))
|
|
38
|
+
throw new ToolError(`${path}: only images, clips and audio files can be uploaded (${Object.keys(MEDIA_TYPES).join(' ')}).`);
|
|
39
|
+
return real;
|
|
40
|
+
}
|
|
25
41
|
/** A file, or a folder's media files in name order (2 before 10). */
|
|
26
42
|
export async function expandPath(path) {
|
|
27
43
|
const full = resolve(expandHome(path));
|
|
@@ -29,7 +45,7 @@ export async function expandPath(path) {
|
|
|
29
45
|
if (!info)
|
|
30
46
|
throw new ToolError(`${path}: no such file or folder on this machine (paths are read where the server runs; absolute paths are safest).`);
|
|
31
47
|
if (info.isFile())
|
|
32
|
-
return [full];
|
|
48
|
+
return [await mediaFile(path, full)];
|
|
33
49
|
const names = (await readdir(full, { withFileTypes: true }))
|
|
34
50
|
.filter((d) => d.isFile() && !d.name.startsWith('.') && mediaType(d.name))
|
|
35
51
|
.map((d) => d.name)
|
|
@@ -39,10 +55,11 @@ export async function expandPath(path) {
|
|
|
39
55
|
return names.map((n) => join(full, n));
|
|
40
56
|
}
|
|
41
57
|
export async function pathSource(path) {
|
|
42
|
-
const
|
|
43
|
-
const info = await stat(
|
|
58
|
+
const requested = resolve(expandHome(path));
|
|
59
|
+
const info = await stat(requested).catch(() => null);
|
|
44
60
|
if (!info?.isFile())
|
|
45
61
|
throw new ToolError(`${path}: no such file on this machine.`);
|
|
62
|
+
const full = await mediaFile(path, requested);
|
|
46
63
|
const type = mediaType(full) ?? '';
|
|
47
64
|
return {
|
|
48
65
|
name: basename(full),
|
|
@@ -70,23 +87,21 @@ export async function pathSource(path) {
|
|
|
70
87
|
function nameFromResponse(url, response) {
|
|
71
88
|
const disposition = response.headers.get('content-disposition') ?? '';
|
|
72
89
|
const m = /filename\*?=(?:UTF-8'')?"?([^";]+)"?/i.exec(disposition);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const last = new URL(url).pathname.split('/').filter(Boolean).pop();
|
|
76
|
-
return last ? decodeURIComponent(last) : 'download';
|
|
90
|
+
const last = m?.[1] ?? new URL(url).pathname.split('/').filter(Boolean).pop();
|
|
91
|
+
return last ? basename(decoded(last).split('\\').join('/')) || 'download' : 'download';
|
|
77
92
|
}
|
|
78
|
-
/**
|
|
79
|
-
|
|
80
|
-
let parsed;
|
|
93
|
+
/** The site names the file, so a bad escape in it must not fail the download. */
|
|
94
|
+
function decoded(name) {
|
|
81
95
|
try {
|
|
82
|
-
|
|
96
|
+
return decodeURIComponent(name);
|
|
83
97
|
}
|
|
84
98
|
catch {
|
|
85
|
-
|
|
99
|
+
return name;
|
|
86
100
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
101
|
+
}
|
|
102
|
+
/** A public link: streamed when its size is known, read whole (up to 512 MB) when it is not. */
|
|
103
|
+
export async function urlSource(url, outside, signal) {
|
|
104
|
+
const response = await fetchPublic(url, outside, signal);
|
|
90
105
|
if (!response.ok || !response.body)
|
|
91
106
|
throw new ToolError(`${url}: HTTP ${response.status}.`);
|
|
92
107
|
const name = nameFromResponse(url, response);
|
|
@@ -103,9 +118,15 @@ export async function urlSource(url, fetchImpl = globalThis.fetch) {
|
|
|
103
118
|
const reader = body.getReader();
|
|
104
119
|
let pending = [];
|
|
105
120
|
let have = 0;
|
|
121
|
+
let read = 0;
|
|
106
122
|
for (;;) {
|
|
107
123
|
const { done, value } = await reader.read();
|
|
108
124
|
if (value) {
|
|
125
|
+
read += value.length;
|
|
126
|
+
if (read > length) {
|
|
127
|
+
await reader.cancel();
|
|
128
|
+
throw new ToolError(`${url}: sent more than the ${length} bytes it announced.`);
|
|
129
|
+
}
|
|
109
130
|
pending.push(value);
|
|
110
131
|
have += value.length;
|
|
111
132
|
}
|
|
@@ -123,10 +144,7 @@ export async function urlSource(url, fetchImpl = globalThis.fetch) {
|
|
|
123
144
|
},
|
|
124
145
|
};
|
|
125
146
|
}
|
|
126
|
-
|
|
127
|
-
if (data.length > MAX_IN_MEMORY)
|
|
128
|
-
throw new ToolError(`${url}: over 512 MB with no Content-Length; upload it from a machine instead.`);
|
|
129
|
-
return bytesSource(name, data, type);
|
|
147
|
+
return bytesSource(name, await readCapped(response, MAX_IN_MEMORY, `${url}: over 512 MB with no Content-Length; upload it from a machine instead.`), type);
|
|
130
148
|
}
|
|
131
149
|
export function bytesSource(name, data, type = mediaType(name) ?? '') {
|
|
132
150
|
return {
|
|
@@ -280,26 +298,33 @@ export function rewriteRefs(value, ids) {
|
|
|
280
298
|
}
|
|
281
299
|
return value;
|
|
282
300
|
}
|
|
301
|
+
const tooLarge = (where) => new ToolError(`${where}: the plan is over 16 MB; a plan holds shots and ids, the files go beside it.`);
|
|
283
302
|
function parsePlan(text, where) {
|
|
284
303
|
let plan;
|
|
285
304
|
try {
|
|
286
305
|
plan = JSON.parse(text);
|
|
287
306
|
}
|
|
288
|
-
catch
|
|
289
|
-
|
|
307
|
+
catch {
|
|
308
|
+
// Not JSON.parse's message: it quotes the file, and a path can point at any file on the machine.
|
|
309
|
+
throw new ToolError(`${where}: the plan isn't valid JSON.`);
|
|
290
310
|
}
|
|
291
311
|
if (!plan || typeof plan !== 'object' || Array.isArray(plan))
|
|
292
312
|
throw new ToolError(`${where}: the plan is an object {title, shots, …}.`);
|
|
293
313
|
return plan;
|
|
294
314
|
}
|
|
295
|
-
|
|
315
|
+
/** The media files under a plan: the only ones it can name, so nothing else in the folder can be sent by naming it. */
|
|
316
|
+
async function walk(dir, root = dir, out = [], depth = 0) {
|
|
317
|
+
if (depth > MAX_WALK_DEPTH)
|
|
318
|
+
return out;
|
|
296
319
|
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
320
|
+
if (out.length >= MAX_WALK_FILES)
|
|
321
|
+
break;
|
|
297
322
|
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
298
323
|
continue;
|
|
299
324
|
const full = join(dir, entry.name);
|
|
300
325
|
if (entry.isDirectory())
|
|
301
|
-
await walk(full, root, out);
|
|
302
|
-
else if (entry.isFile())
|
|
326
|
+
await walk(full, root, out, depth + 1);
|
|
327
|
+
else if (entry.isFile() && mediaType(entry.name))
|
|
303
328
|
out.push(relative(root, full).split('\\').join('/'));
|
|
304
329
|
}
|
|
305
330
|
return out;
|
|
@@ -311,9 +336,13 @@ async function zipBundle(range, where, close) {
|
|
|
311
336
|
await close();
|
|
312
337
|
throw new ToolError(`${where}: the zip has no plan.json.`);
|
|
313
338
|
}
|
|
339
|
+
if (planEntry.size > MAX_PLAN_BYTES) {
|
|
340
|
+
await close();
|
|
341
|
+
throw tooLarge(where);
|
|
342
|
+
}
|
|
314
343
|
const root = planEntry.name.slice(0, -'plan.json'.length);
|
|
315
344
|
const plan = parsePlan((await zipRead(range, planEntry)).toString('utf8'), where);
|
|
316
|
-
const files =
|
|
345
|
+
const files = Object.create(null);
|
|
317
346
|
for (const entry of entries) {
|
|
318
347
|
if (entry === planEntry || basename(entry.name).startsWith('.'))
|
|
319
348
|
continue;
|
|
@@ -322,29 +351,41 @@ async function zipBundle(range, where, close) {
|
|
|
322
351
|
}
|
|
323
352
|
return { plan, files, close };
|
|
324
353
|
}
|
|
325
|
-
/**
|
|
354
|
+
/**
|
|
355
|
+
* A plan from this machine: a zip, a plan.json (the files beside it come along), or a folder holding plan.json. The plan's
|
|
356
|
+
* text goes to the platform, so only a file really named plan.json or .zip is read: this is how the path can't be a
|
|
357
|
+
* credentials file that happens to be JSON. A link is judged on what it points at.
|
|
358
|
+
*/
|
|
326
359
|
export async function planFromPath(path) {
|
|
327
360
|
const full = resolve(expandHome(path));
|
|
328
361
|
const info = await stat(full).catch(() => null);
|
|
329
362
|
if (!info)
|
|
330
363
|
throw new ToolError(`${path}: no such file or folder on this machine.`);
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
364
|
+
const refused = new ToolError(`${path}: a plan is a file named plan.json, a .zip, or a folder holding plan.json.`);
|
|
365
|
+
if (!info.isDirectory() && !info.isFile())
|
|
366
|
+
throw refused;
|
|
367
|
+
const asked = info.isDirectory() ? join(full, 'plan.json') : full;
|
|
368
|
+
const planInfo = await stat(asked).catch(() => null);
|
|
369
|
+
if (!planInfo?.isFile())
|
|
370
|
+
throw new ToolError(`${path}: no plan.json in that folder.`);
|
|
371
|
+
const real = await realpath(asked);
|
|
372
|
+
const name = basename(real).toLowerCase();
|
|
373
|
+
if (!info.isDirectory() && extname(name) === '.zip') {
|
|
374
|
+
const handle = await open(real, 'r');
|
|
375
|
+
const range = handleRange(handle, planInfo.size);
|
|
341
376
|
if (await isZip(range))
|
|
342
377
|
return zipBundle(range, path, () => handle.close());
|
|
343
378
|
await handle.close();
|
|
344
|
-
|
|
379
|
+
throw refused;
|
|
345
380
|
}
|
|
346
|
-
|
|
347
|
-
|
|
381
|
+
if (name !== 'plan.json')
|
|
382
|
+
throw refused;
|
|
383
|
+
if (planInfo.size > MAX_PLAN_BYTES)
|
|
384
|
+
throw tooLarge(path);
|
|
385
|
+
const dir = dirname(asked);
|
|
386
|
+
const planPath = asked;
|
|
387
|
+
const plan = parsePlan(await readFile(real, 'utf8'), path);
|
|
388
|
+
const files = Object.create(null);
|
|
348
389
|
for (const rel of await walk(dir)) {
|
|
349
390
|
if (join(dir, rel) === planPath)
|
|
350
391
|
continue;
|
|
@@ -353,22 +394,28 @@ export async function planFromPath(path) {
|
|
|
353
394
|
return { plan, files, close: async () => { } };
|
|
354
395
|
}
|
|
355
396
|
/** A plan from a link: a zip or a plan.json, read whole (up to 512 MB). */
|
|
356
|
-
export async function planFromUrl(url,
|
|
357
|
-
const response = await
|
|
397
|
+
export async function planFromUrl(url, outside, signal) {
|
|
398
|
+
const response = await fetchPublic(url, outside, signal);
|
|
358
399
|
if (!response.ok)
|
|
359
400
|
throw new ToolError(`${url}: HTTP ${response.status}.`);
|
|
360
|
-
const data =
|
|
361
|
-
if (data.length > MAX_IN_MEMORY)
|
|
362
|
-
throw new ToolError(`${url}: over 512 MB; import it from a machine with the file instead.`);
|
|
401
|
+
const data = await readCapped(response, MAX_IN_MEMORY, `${url}: over 512 MB; import it from a machine with the file instead.`);
|
|
363
402
|
const range = bufferRange(data);
|
|
364
403
|
if (await isZip(range))
|
|
365
404
|
return zipBundle(range, url, async () => { });
|
|
405
|
+
if (data.length > MAX_PLAN_BYTES)
|
|
406
|
+
throw tooLarge(url);
|
|
366
407
|
return { plan: parsePlan(data.toString('utf8'), url), files: {}, close: async () => { } };
|
|
367
408
|
}
|
|
368
409
|
/** Why a path can't be read on this connection, with the way out. */
|
|
369
410
|
export function noLocalFiles(s, companyId) {
|
|
370
411
|
const studio = companyId ? ` or drop the files into the Studio library (${s.link(`/c/${companyId}/studio`)}) and use their media ids` : '';
|
|
371
|
-
return new ToolError(`This connection runs in the cloud, so it can't read files on your computer. Give public URLs instead, run the server on your machine (npx -y @autopo/mcp
|
|
412
|
+
return new ToolError(`This connection runs in the cloud, so it can't read files on your computer. Give public URLs instead, run the server on your machine (npx -y @autopo/mcp)${studio}.`);
|
|
413
|
+
}
|
|
414
|
+
/** The dialog before files leave this machine: what goes, and how much of it. */
|
|
415
|
+
export function uploadQuestion(names, bytes, where) {
|
|
416
|
+
const shown = names.slice(0, 12).map((n) => `• ${n}`).join('\n');
|
|
417
|
+
const rest = names.length > 12 ? `\n…and ${names.length - 12} more` : '';
|
|
418
|
+
return `Upload ${names.length} file${names.length === 1 ? '' : 's'} (${mb(bytes)}) from this computer to ${where}?\n${shown}${rest}`;
|
|
372
419
|
}
|
|
373
420
|
export function describeApiError(error) {
|
|
374
421
|
if (error instanceof ApiError)
|
package/dist/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
* - 2026-07-28 clients are served statelessly by createMcpHandler (any replica, no affinity);
|
|
4
4
|
* - 2025-era clients (today's Claude Code, Codex, Cursor) get a session-aware transport, because that is the only way
|
|
5
5
|
* their elicitation dialogs (confirmations, the company picker) can reach them over HTTP. Sessions die after idling.
|
|
6
|
+
*
|
|
7
|
+
* Without a token a client can still see what the server is: initialize and the lists answer, so an agent choosing a
|
|
8
|
+
* server can read its tools first. Those calls reach neither the platform nor a session. Everything that acts or reads a
|
|
9
|
+
* person's data answers 401, as it would at the door.
|
|
6
10
|
*/
|
|
7
11
|
import { type IncomingMessage, type ServerResponse } from 'node:http';
|
|
8
12
|
export interface HttpOptions {
|
|
@@ -14,9 +18,15 @@ export interface HttpOptions {
|
|
|
14
18
|
mediaDomains: string[];
|
|
15
19
|
/** Let tools read paths on this host (only for a server you run for yourself; off for a shared one). */
|
|
16
20
|
local?: boolean;
|
|
17
|
-
/** Hostnames this server answers for; empty: any (a public service behind its own DNS). */
|
|
21
|
+
/** Hostnames this server answers for; empty: any (a public service behind its own DNS), or only this machine's on loopback. */
|
|
18
22
|
allowedHosts?: string[];
|
|
23
|
+
/** Browser origins allowed beyond this server's own and this machine's. Clients that aren't browsers send none. */
|
|
24
|
+
allowedOrigins?: string[];
|
|
19
25
|
/** Seconds a 2025-era session may idle before it is closed. */
|
|
20
26
|
sessionIdleSeconds?: number;
|
|
27
|
+
/** Live 2025-era sessions, across every token. */
|
|
28
|
+
maxSessions?: number;
|
|
29
|
+
/** Tests only. */
|
|
30
|
+
fetch?: typeof fetch;
|
|
21
31
|
}
|
|
22
32
|
export declare function serveHttp(options: HttpOptions): import("node:http").Server<typeof IncomingMessage, typeof ServerResponse>;
|
package/dist/http.js
CHANGED
|
@@ -3,26 +3,55 @@
|
|
|
3
3
|
* - 2026-07-28 clients are served statelessly by createMcpHandler (any replica, no affinity);
|
|
4
4
|
* - 2025-era clients (today's Claude Code, Codex, Cursor) get a session-aware transport, because that is the only way
|
|
5
5
|
* their elicitation dialogs (confirmations, the company picker) can reach them over HTTP. Sessions die after idling.
|
|
6
|
+
*
|
|
7
|
+
* Without a token a client can still see what the server is: initialize and the lists answer, so an agent choosing a
|
|
8
|
+
* server can read its tools first. Those calls reach neither the platform nor a session. Everything that acts or reads a
|
|
9
|
+
* person's data answers 401, as it would at the door.
|
|
6
10
|
*/
|
|
7
11
|
import { createServer as createHttpServer } from 'node:http';
|
|
8
12
|
import { randomUUID, createHash } from 'node:crypto';
|
|
9
13
|
import { createMcpHandler, isLegacyRequest } from '@modelcontextprotocol/server';
|
|
10
14
|
import { NodeStreamableHTTPServerTransport, toNodeHandler, toWebRequest } from '@modelcontextprotocol/node';
|
|
15
|
+
import { Api, ApiError, assertSafeApiUrl } from './api.js';
|
|
11
16
|
import { createServer, VERSION } from './server.js';
|
|
17
|
+
const MAX_BODY = 8 * 1024 * 1024;
|
|
18
|
+
const MAX_PUBLIC_BODY = 64 * 1024;
|
|
19
|
+
const MAX_SESSIONS_PER_TOKEN = 20;
|
|
20
|
+
const TOKEN_CHECK_MS = 60_000;
|
|
21
|
+
const MAX_TOKENS_SEEN = 10_000;
|
|
22
|
+
const PUBLIC_PER_MINUTE = 600;
|
|
23
|
+
const LOOPBACK = new Set(['localhost', '127.0.0.1', '[::1]', '::1']);
|
|
24
|
+
/** What a client may ask without a token: what the server is, never anything of a person's. */
|
|
25
|
+
const PUBLIC_METHODS = new Set(['initialize', 'ping', 'tools/list', 'prompts/list', 'resources/list', 'resources/templates/list', 'server/discover', 'notifications/initialized']);
|
|
26
|
+
const isPublicCall = (body) => {
|
|
27
|
+
const method = body && typeof body === 'object' ? body.method : undefined;
|
|
28
|
+
return typeof method === 'string' && PUBLIC_METHODS.has(method);
|
|
29
|
+
};
|
|
30
|
+
class TooLarge extends Error {
|
|
31
|
+
}
|
|
32
|
+
class PlatformDown extends Error {
|
|
33
|
+
}
|
|
12
34
|
const bearer = (req) => {
|
|
13
35
|
const header = req.headers.authorization ?? '';
|
|
14
36
|
const match = /^Bearer\s+(.+)$/i.exec(header.trim());
|
|
15
37
|
return match ? match[1].trim() : null;
|
|
16
38
|
};
|
|
17
|
-
const fingerprint = (token) => createHash('sha256').update(token).digest('hex')
|
|
39
|
+
const fingerprint = (token) => createHash('sha256').update(token).digest('hex');
|
|
18
40
|
function json(res, status, body, headers = {}) {
|
|
19
41
|
res.writeHead(status, { 'content-type': 'application/json', ...headers });
|
|
20
42
|
res.end(JSON.stringify(body));
|
|
21
43
|
}
|
|
22
|
-
async function readBody(req) {
|
|
44
|
+
async function readBody(req, limit) {
|
|
45
|
+
if (Number(req.headers['content-length']) > limit)
|
|
46
|
+
throw new TooLarge();
|
|
23
47
|
const chunks = [];
|
|
24
|
-
|
|
48
|
+
let size = 0;
|
|
49
|
+
for await (const chunk of req) {
|
|
50
|
+
size += chunk.length;
|
|
51
|
+
if (size > limit)
|
|
52
|
+
throw new TooLarge();
|
|
25
53
|
chunks.push(chunk);
|
|
54
|
+
}
|
|
26
55
|
const text = Buffer.concat(chunks).toString('utf8');
|
|
27
56
|
if (!text)
|
|
28
57
|
return undefined;
|
|
@@ -34,8 +63,58 @@ async function readBody(req) {
|
|
|
34
63
|
}
|
|
35
64
|
}
|
|
36
65
|
export function serveHttp(options) {
|
|
66
|
+
assertSafeApiUrl(options.apiUrl);
|
|
67
|
+
// Any valid token on the platform opens this server, not only the host's owner, so its disk stays on loopback.
|
|
68
|
+
if (options.local && !LOOPBACK.has(options.host)) {
|
|
69
|
+
throw new Error(`AUTOPOIESIS_ALLOW_PATHS lets every caller read this host's media files, so it needs --host 127.0.0.1 (not ${options.host}).`);
|
|
70
|
+
}
|
|
37
71
|
const idleMs = (options.sessionIdleSeconds ?? 1800) * 1000;
|
|
38
|
-
const
|
|
72
|
+
const maxSessions = options.maxSessions ?? 2000;
|
|
73
|
+
const hosts = options.allowedHosts?.length ? options.allowedHosts : LOOPBACK.has(options.host) ? [...LOOPBACK] : [];
|
|
74
|
+
const origins = new Set([...(options.allowedOrigins ?? []), ...(options.publicUrl ? [new URL(options.publicUrl).origin] : [])]);
|
|
75
|
+
const originAllowed = (origin) => {
|
|
76
|
+
if (origins.has(origin))
|
|
77
|
+
return true;
|
|
78
|
+
return URL.canParse(origin) && LOOPBACK.has(new URL(origin).hostname);
|
|
79
|
+
};
|
|
80
|
+
const make = (token) => createServer({ token, apiUrl: options.apiUrl, appUrl: options.appUrl, mediaDomains: options.mediaDomains, local: options.local ?? false, ...(options.publicUrl ? { publicUrl: options.publicUrl } : {}), ...(options.fetch ? { fetch: options.fetch } : {}) });
|
|
81
|
+
// What a caller nobody knows may cost: public discovery and the first check of a token. Per socket address: behind a
|
|
82
|
+
// proxy that is one budget for everyone, because a forwarded address can't be trusted here.
|
|
83
|
+
let budgetMinute = 0;
|
|
84
|
+
const spent = new Map();
|
|
85
|
+
const budgetLeft = (req) => {
|
|
86
|
+
const minute = Math.floor(Date.now() / 60_000);
|
|
87
|
+
if (minute !== budgetMinute) {
|
|
88
|
+
budgetMinute = minute;
|
|
89
|
+
spent.clear();
|
|
90
|
+
}
|
|
91
|
+
const address = req.socket.remoteAddress ?? '';
|
|
92
|
+
const calls = (spent.get(address) ?? 0) + 1;
|
|
93
|
+
spent.set(address, calls);
|
|
94
|
+
return calls <= PUBLIC_PER_MINUTE;
|
|
95
|
+
};
|
|
96
|
+
/** A wrong token is a 401 on every message, before a body is read, a server is built or a session is held for it. */
|
|
97
|
+
const known = new Map();
|
|
98
|
+
async function tokenWorks(token) {
|
|
99
|
+
const key = fingerprint(token);
|
|
100
|
+
const hit = known.get(key);
|
|
101
|
+
if (hit && hit.until > Date.now())
|
|
102
|
+
return hit.works;
|
|
103
|
+
let works = true;
|
|
104
|
+
try {
|
|
105
|
+
await new Api({ baseUrl: options.apiUrl, token, ...(options.fetch ? { fetch: options.fetch } : {}) }).get('/api/me');
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (!(error instanceof ApiError) || error.status !== 401)
|
|
109
|
+
throw new PlatformDown();
|
|
110
|
+
works = false;
|
|
111
|
+
}
|
|
112
|
+
if (known.size >= MAX_TOKENS_SEEN)
|
|
113
|
+
known.clear();
|
|
114
|
+
known.set(key, { works, until: Date.now() + TOKEN_CHECK_MS });
|
|
115
|
+
return works;
|
|
116
|
+
}
|
|
117
|
+
const throttled = (res) => json(res, 429, { error: { code: 'throttled', message: 'Too many requests: try again in a minute.' } }, { 'retry-after': '60' });
|
|
39
118
|
// modern leg: stateless, a fresh server per request from the caller's token
|
|
40
119
|
const modern = createMcpHandler((ctx) => make(ctx.authInfo?.token ?? ''), { legacy: 'reject', onerror: (e) => console.error('[mcp]', e.message) });
|
|
41
120
|
const modernNode = toNodeHandler(modern, { onerror: (e) => console.error('[mcp]', e.message) });
|
|
@@ -49,13 +128,15 @@ export function serveHttp(options) {
|
|
|
49
128
|
}
|
|
50
129
|
}, 60_000);
|
|
51
130
|
sweep.unref();
|
|
131
|
+
const signIn = (res, message) => json(res, 401, { error: { code: 'not_authenticated', message } }, { 'www-authenticate': 'Bearer realm="autopoiesis"' });
|
|
52
132
|
async function legacy(req, res, token, body) {
|
|
133
|
+
const owner = fingerprint(token);
|
|
53
134
|
const sid = typeof req.headers['mcp-session-id'] === 'string' ? req.headers['mcp-session-id'] : undefined;
|
|
54
135
|
if (sid) {
|
|
55
136
|
const live = sessions.get(sid);
|
|
56
137
|
if (!live)
|
|
57
138
|
return json(res, 404, { jsonrpc: '2.0', error: { code: -32001, message: 'Session not found: start again.' }, id: null });
|
|
58
|
-
if (live.
|
|
139
|
+
if (live.owner !== owner)
|
|
59
140
|
return json(res, 403, { error: { code: 'forbidden', message: 'This session belongs to another token.' } });
|
|
60
141
|
live.last = Date.now();
|
|
61
142
|
await live.transport.handleRequest(req, res, body);
|
|
@@ -63,9 +144,13 @@ export function serveHttp(options) {
|
|
|
63
144
|
}
|
|
64
145
|
if (req.method !== 'POST')
|
|
65
146
|
return json(res, 400, { error: { code: 'bad_request', message: 'Open a session with an initialize request first.' } });
|
|
147
|
+
const mine = [...sessions.values()].filter((live) => live.owner === owner).length;
|
|
148
|
+
if (mine >= MAX_SESSIONS_PER_TOKEN || sessions.size >= maxSessions) {
|
|
149
|
+
return json(res, 429, { error: { code: 'too_many_sessions', message: 'Too many open sessions: close one or wait for it to idle out.' } }, { 'retry-after': '60' });
|
|
150
|
+
}
|
|
66
151
|
const transport = new NodeStreamableHTTPServerTransport({
|
|
67
152
|
sessionIdGenerator: () => randomUUID(),
|
|
68
|
-
onsessioninitialized: (id) => { sessions.set(id, { transport,
|
|
153
|
+
onsessioninitialized: (id) => { sessions.set(id, { transport, owner, last: Date.now() }); },
|
|
69
154
|
onsessionclosed: (id) => { sessions.delete(id); },
|
|
70
155
|
});
|
|
71
156
|
transport.onclose = () => { if (transport.sessionId)
|
|
@@ -74,14 +159,28 @@ export function serveHttp(options) {
|
|
|
74
159
|
await server.connect(transport);
|
|
75
160
|
await transport.handleRequest(req, res, body);
|
|
76
161
|
}
|
|
162
|
+
/** One answer with no session behind it: a fresh server, gone when the response is. */
|
|
163
|
+
async function discover(req, res, body) {
|
|
164
|
+
const web = await toWebRequest(req, body);
|
|
165
|
+
if (!(await isLegacyRequest(web, body)))
|
|
166
|
+
return modernNode(req, res, body);
|
|
167
|
+
const transport = new NodeStreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
168
|
+
const server = make('');
|
|
169
|
+
res.on('close', () => { void transport.close(); void server.close(); });
|
|
170
|
+
await server.connect(transport);
|
|
171
|
+
await transport.handleRequest(req, res, body);
|
|
172
|
+
}
|
|
77
173
|
const httpServer = createHttpServer(async (req, res) => {
|
|
78
174
|
try {
|
|
79
|
-
const url = new URL(req.url ?? '/',
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
175
|
+
const url = new URL(req.url ?? '/', 'http://mcp');
|
|
176
|
+
// The Host header itself: a request line can name another host, and that is not what a rebound name would send.
|
|
177
|
+
const hostHeader = req.headers.host ?? '';
|
|
178
|
+
const hostname = URL.canParse(`http://${hostHeader}`) ? new URL(`http://${hostHeader}`).hostname : '';
|
|
179
|
+
if (hosts.length && !hosts.includes(hostname))
|
|
180
|
+
return json(res, 403, { error: { code: 'forbidden', message: 'Unknown host.' } });
|
|
181
|
+
// The protocol's defence against a web page rebinding a name onto this server.
|
|
182
|
+
if (req.headers.origin && !originAllowed(req.headers.origin))
|
|
183
|
+
return json(res, 403, { error: { code: 'forbidden', message: 'Unknown origin.' } });
|
|
85
184
|
if (url.pathname === '/healthz')
|
|
86
185
|
return json(res, 200, { ok: true, version: VERSION });
|
|
87
186
|
if (url.pathname === '/' && req.method === 'GET') {
|
|
@@ -91,17 +190,31 @@ export function serveHttp(options) {
|
|
|
91
190
|
return json(res, 404, { error: { code: 'not_found', message: 'The MCP endpoint is /mcp.' } });
|
|
92
191
|
const token = bearer(req);
|
|
93
192
|
if (!token) {
|
|
94
|
-
|
|
193
|
+
const askedBody = req.method === 'POST' ? await readBody(req, MAX_PUBLIC_BODY) : undefined;
|
|
194
|
+
if (!isPublicCall(askedBody))
|
|
195
|
+
return signIn(res, 'Send Authorization: Bearer <your token>. Make one in the app: Connectors → MCP.');
|
|
196
|
+
if (!budgetLeft(req))
|
|
197
|
+
return throttled(res);
|
|
198
|
+
return await discover(req, res, askedBody);
|
|
95
199
|
}
|
|
96
|
-
const
|
|
200
|
+
const fresh = !known.get(fingerprint(token));
|
|
201
|
+
if (fresh && !budgetLeft(req))
|
|
202
|
+
return throttled(res);
|
|
203
|
+
if (!(await tokenWorks(token)))
|
|
204
|
+
return signIn(res, 'This token is unknown or revoked. Make one in the app: Connectors → MCP.');
|
|
205
|
+
const body = req.method === 'POST' ? await readBody(req, MAX_BODY) : undefined;
|
|
97
206
|
const authInfo = { token, clientId: fingerprint(token), scopes: [] };
|
|
98
207
|
req.auth = authInfo;
|
|
99
208
|
const web = await toWebRequest(req, body);
|
|
100
209
|
if (await isLegacyRequest(web, body))
|
|
101
|
-
return legacy(req, res, token, body);
|
|
210
|
+
return await legacy(req, res, token, body);
|
|
102
211
|
await modernNode(req, res, body);
|
|
103
212
|
}
|
|
104
213
|
catch (error) {
|
|
214
|
+
if (error instanceof TooLarge)
|
|
215
|
+
return json(res, 413, { error: { code: 'too_large', message: 'The message is too large.' } }, { connection: 'close' });
|
|
216
|
+
if (error instanceof PlatformDown)
|
|
217
|
+
return json(res, 503, { error: { code: 'unavailable', message: 'The platform could not check the token: try again in a moment.' } }, { 'retry-after': '30' });
|
|
105
218
|
console.error('[mcp]', error.message);
|
|
106
219
|
if (!res.headersSent)
|
|
107
220
|
json(res, 500, { error: { code: 'internal', message: 'The server could not handle that request.' } });
|