@autopo/mcp 0.4.4 → 0.5.1

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/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 full = resolve(expandHome(path));
43
- const info = await stat(full).catch(() => null);
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
- if (m?.[1])
74
- return decodeURIComponent(m[1]);
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
- /** A public link: streamed when its size is known, read whole (up to 512 MB) when it is not. */
79
- export async function urlSource(url, fetchImpl = globalThis.fetch) {
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
- parsed = new URL(url);
96
+ return decodeURIComponent(name);
83
97
  }
84
98
  catch {
85
- throw new ToolError(`${url}: not a URL.`);
99
+ return name;
86
100
  }
87
- if (!['http:', 'https:'].includes(parsed.protocol))
88
- throw new ToolError(`${url}: only http(s) links can be fetched.`);
89
- const response = await fetchImpl(url);
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
- const data = Buffer.from(await response.arrayBuffer());
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 (error) {
289
- throw new ToolError(`${where}: the plan isn't valid JSON (${error.message}).`);
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
- async function walk(dir, root = dir, out = []) {
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
- /** A plan from this machine: a zip, a plan.json (the files beside it come along), or a folder holding plan.json. */
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
- let dir = full;
332
- let planPath = full;
333
- if (info.isDirectory()) {
334
- planPath = join(full, 'plan.json');
335
- if (!(await stat(planPath).catch(() => null)))
336
- throw new ToolError(`${path}: no plan.json in that folder.`);
337
- }
338
- else {
339
- const handle = await open(full, 'r');
340
- const range = handleRange(handle, info.size);
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
- dir = resolve(full, '..');
379
+ throw refused;
345
380
  }
346
- const plan = parsePlan(await readFile(planPath, 'utf8'), path);
347
- const files = {};
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, fetchImpl = globalThis.fetch) {
357
- const response = await fetchImpl(url);
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 = Buffer.from(await response.arrayBuffer());
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, see https://docs.autopoiesis.app/clients)${studio}.`);
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,17 @@ 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[];
25
+ /** Proxies in front that append the caller to X-Forwarded-For (Cloud Run: 1); 0 trusts only the socket's address. */
26
+ trustedProxyHops?: number;
19
27
  /** Seconds a 2025-era session may idle before it is closed. */
20
28
  sessionIdleSeconds?: number;
29
+ /** Live 2025-era sessions, across every token. */
30
+ maxSessions?: number;
31
+ /** Tests only. */
32
+ fetch?: typeof fetch;
21
33
  }
22
34
  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').slice(0, 16);
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
- for await (const chunk of req)
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,66 @@ 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 make = (token) => createServer({ token, apiUrl: options.apiUrl, appUrl: options.appUrl, mediaDomains: options.mediaDomains, local: options.local ?? false, ...(options.publicUrl ? { publicUrl: options.publicUrl } : {}) });
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
+ // The caller's address: with trusted proxies, the entry they appended. Anything further left is what the caller sent.
82
+ const callerAddress = (req) => {
83
+ const hops = options.trustedProxyHops ?? 0;
84
+ const forwarded = String(req.headers['x-forwarded-for'] ?? '').split(',').map((part) => part.trim()).filter(Boolean);
85
+ if (hops > 0 && forwarded.length)
86
+ return forwarded[Math.max(forwarded.length - hops, 0)];
87
+ return req.socket.remoteAddress ?? '';
88
+ };
89
+ // What a caller nobody knows may cost: public discovery and the first check of a token, per address. Behind a proxy
90
+ // left untrusted that is one budget for everyone.
91
+ let budgetMinute = 0;
92
+ const spent = new Map();
93
+ const budgetLeft = (req) => {
94
+ const minute = Math.floor(Date.now() / 60_000);
95
+ if (minute !== budgetMinute) {
96
+ budgetMinute = minute;
97
+ spent.clear();
98
+ }
99
+ const address = callerAddress(req);
100
+ const calls = (spent.get(address) ?? 0) + 1;
101
+ spent.set(address, calls);
102
+ return calls <= PUBLIC_PER_MINUTE;
103
+ };
104
+ /** 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. */
105
+ const known = new Map();
106
+ async function tokenWorks(token) {
107
+ const key = fingerprint(token);
108
+ const hit = known.get(key);
109
+ if (hit && hit.until > Date.now())
110
+ return hit.works;
111
+ let works = true;
112
+ try {
113
+ await new Api({ baseUrl: options.apiUrl, token, ...(options.fetch ? { fetch: options.fetch } : {}) }).get('/api/me');
114
+ }
115
+ catch (error) {
116
+ if (!(error instanceof ApiError) || error.status !== 401)
117
+ throw new PlatformDown();
118
+ works = false;
119
+ }
120
+ if (known.size >= MAX_TOKENS_SEEN)
121
+ known.clear();
122
+ known.set(key, { works, until: Date.now() + TOKEN_CHECK_MS });
123
+ return works;
124
+ }
125
+ const throttled = (res) => json(res, 429, { error: { code: 'throttled', message: 'Too many requests: try again in a minute.' } }, { 'retry-after': '60' });
39
126
  // modern leg: stateless, a fresh server per request from the caller's token
40
127
  const modern = createMcpHandler((ctx) => make(ctx.authInfo?.token ?? ''), { legacy: 'reject', onerror: (e) => console.error('[mcp]', e.message) });
41
128
  const modernNode = toNodeHandler(modern, { onerror: (e) => console.error('[mcp]', e.message) });
@@ -49,13 +136,15 @@ export function serveHttp(options) {
49
136
  }
50
137
  }, 60_000);
51
138
  sweep.unref();
139
+ const signIn = (res, message) => json(res, 401, { error: { code: 'not_authenticated', message } }, { 'www-authenticate': 'Bearer realm="autopoiesis"' });
52
140
  async function legacy(req, res, token, body) {
141
+ const owner = fingerprint(token);
53
142
  const sid = typeof req.headers['mcp-session-id'] === 'string' ? req.headers['mcp-session-id'] : undefined;
54
143
  if (sid) {
55
144
  const live = sessions.get(sid);
56
145
  if (!live)
57
146
  return json(res, 404, { jsonrpc: '2.0', error: { code: -32001, message: 'Session not found: start again.' }, id: null });
58
- if (live.token !== token)
147
+ if (live.owner !== owner)
59
148
  return json(res, 403, { error: { code: 'forbidden', message: 'This session belongs to another token.' } });
60
149
  live.last = Date.now();
61
150
  await live.transport.handleRequest(req, res, body);
@@ -63,9 +152,13 @@ export function serveHttp(options) {
63
152
  }
64
153
  if (req.method !== 'POST')
65
154
  return json(res, 400, { error: { code: 'bad_request', message: 'Open a session with an initialize request first.' } });
155
+ const mine = [...sessions.values()].filter((live) => live.owner === owner).length;
156
+ if (mine >= MAX_SESSIONS_PER_TOKEN || sessions.size >= maxSessions) {
157
+ 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' });
158
+ }
66
159
  const transport = new NodeStreamableHTTPServerTransport({
67
160
  sessionIdGenerator: () => randomUUID(),
68
- onsessioninitialized: (id) => { sessions.set(id, { transport, token, last: Date.now() }); },
161
+ onsessioninitialized: (id) => { sessions.set(id, { transport, owner, last: Date.now() }); },
69
162
  onsessionclosed: (id) => { sessions.delete(id); },
70
163
  });
71
164
  transport.onclose = () => { if (transport.sessionId)
@@ -74,14 +167,28 @@ export function serveHttp(options) {
74
167
  await server.connect(transport);
75
168
  await transport.handleRequest(req, res, body);
76
169
  }
170
+ /** One answer with no session behind it: a fresh server, gone when the response is. */
171
+ async function discover(req, res, body) {
172
+ const web = await toWebRequest(req, body);
173
+ if (!(await isLegacyRequest(web, body)))
174
+ return modernNode(req, res, body);
175
+ const transport = new NodeStreamableHTTPServerTransport({ sessionIdGenerator: undefined });
176
+ const server = make('');
177
+ res.on('close', () => { void transport.close(); void server.close(); });
178
+ await server.connect(transport);
179
+ await transport.handleRequest(req, res, body);
180
+ }
77
181
  const httpServer = createHttpServer(async (req, res) => {
78
182
  try {
79
- const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
80
- if (options.allowedHosts?.length) {
81
- const host = (req.headers.host ?? '').split(':')[0];
82
- if (!options.allowedHosts.includes(host ?? ''))
83
- return json(res, 403, { error: { code: 'forbidden', message: 'Unknown host.' } });
84
- }
183
+ const url = new URL(req.url ?? '/', 'http://mcp');
184
+ // The Host header itself: a request line can name another host, and that is not what a rebound name would send.
185
+ const hostHeader = req.headers.host ?? '';
186
+ const hostname = URL.canParse(`http://${hostHeader}`) ? new URL(`http://${hostHeader}`).hostname : '';
187
+ if (hosts.length && !hosts.includes(hostname))
188
+ return json(res, 403, { error: { code: 'forbidden', message: 'Unknown host.' } });
189
+ // The protocol's defence against a web page rebinding a name onto this server.
190
+ if (req.headers.origin && !originAllowed(req.headers.origin))
191
+ return json(res, 403, { error: { code: 'forbidden', message: 'Unknown origin.' } });
85
192
  if (url.pathname === '/healthz')
86
193
  return json(res, 200, { ok: true, version: VERSION });
87
194
  if (url.pathname === '/' && req.method === 'GET') {
@@ -91,17 +198,31 @@ export function serveHttp(options) {
91
198
  return json(res, 404, { error: { code: 'not_found', message: 'The MCP endpoint is /mcp.' } });
92
199
  const token = bearer(req);
93
200
  if (!token) {
94
- return json(res, 401, { error: { code: 'not_authenticated', message: 'Send Authorization: Bearer <your token>. Make one in the app: Connectors → MCP.' } }, { 'www-authenticate': 'Bearer realm="autopoiesis", error="invalid_token"' });
201
+ const askedBody = req.method === 'POST' ? await readBody(req, MAX_PUBLIC_BODY) : undefined;
202
+ if (!isPublicCall(askedBody))
203
+ return signIn(res, 'Send Authorization: Bearer <your token>. Make one in the app: Connectors → MCP.');
204
+ if (!budgetLeft(req))
205
+ return throttled(res);
206
+ return await discover(req, res, askedBody);
95
207
  }
96
- const body = req.method === 'POST' ? await readBody(req) : undefined;
208
+ const fresh = !known.get(fingerprint(token));
209
+ if (fresh && !budgetLeft(req))
210
+ return throttled(res);
211
+ if (!(await tokenWorks(token)))
212
+ return signIn(res, 'This token is unknown or revoked. Make one in the app: Connectors → MCP.');
213
+ const body = req.method === 'POST' ? await readBody(req, MAX_BODY) : undefined;
97
214
  const authInfo = { token, clientId: fingerprint(token), scopes: [] };
98
215
  req.auth = authInfo;
99
216
  const web = await toWebRequest(req, body);
100
217
  if (await isLegacyRequest(web, body))
101
- return legacy(req, res, token, body);
218
+ return await legacy(req, res, token, body);
102
219
  await modernNode(req, res, body);
103
220
  }
104
221
  catch (error) {
222
+ if (error instanceof TooLarge)
223
+ return json(res, 413, { error: { code: 'too_large', message: 'The message is too large.' } }, { connection: 'close' });
224
+ if (error instanceof PlatformDown)
225
+ return json(res, 503, { error: { code: 'unavailable', message: 'The platform could not check the token: try again in a moment.' } }, { 'retry-after': '30' });
105
226
  console.error('[mcp]', error.message);
106
227
  if (!res.headersSent)
107
228
  json(res, 500, { error: { code: 'internal', message: 'The server could not handle that request.' } });