@ifc-lite/mcp 0.23.0 → 0.24.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.
Files changed (156) hide show
  1. package/README.md +65 -0
  2. package/dist/cli.js +2 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/context.d.ts.map +1 -1
  5. package/dist/context.js +5 -0
  6. package/dist/context.js.map +1 -1
  7. package/dist/errors.d.ts +2 -0
  8. package/dist/errors.d.ts.map +1 -1
  9. package/dist/errors.js +2 -0
  10. package/dist/errors.js.map +1 -1
  11. package/dist/headless-backend-align.d.ts +6 -0
  12. package/dist/headless-backend-align.d.ts.map +1 -0
  13. package/dist/headless-backend-align.js +35 -0
  14. package/dist/headless-backend-align.js.map +1 -0
  15. package/dist/headless-backend-modelling.d.ts +41 -1
  16. package/dist/headless-backend-modelling.d.ts.map +1 -1
  17. package/dist/headless-backend-modelling.js +112 -6
  18. package/dist/headless-backend-modelling.js.map +1 -1
  19. package/dist/headless-backend-room.d.ts +8 -0
  20. package/dist/headless-backend-room.d.ts.map +1 -0
  21. package/dist/headless-backend-room.js +24 -0
  22. package/dist/headless-backend-room.js.map +1 -0
  23. package/dist/headless-backend-store-stubs.d.ts +4 -6
  24. package/dist/headless-backend-store-stubs.d.ts.map +1 -1
  25. package/dist/headless-backend-store-stubs.js +1 -12
  26. package/dist/headless-backend-store-stubs.js.map +1 -1
  27. package/dist/headless-backend-store.d.ts +3 -1
  28. package/dist/headless-backend-store.d.ts.map +1 -1
  29. package/dist/headless-backend-store.js +14 -22
  30. package/dist/headless-backend-store.js.map +1 -1
  31. package/dist/headless-backend.d.ts +4 -0
  32. package/dist/headless-backend.d.ts.map +1 -1
  33. package/dist/headless-backend.js +7 -1
  34. package/dist/headless-backend.js.map +1 -1
  35. package/dist/headless-native-geometry.d.ts +6 -0
  36. package/dist/headless-native-geometry.d.ts.map +1 -0
  37. package/dist/headless-native-geometry.js +31 -0
  38. package/dist/headless-native-geometry.js.map +1 -0
  39. package/dist/headless-room-geometry.d.ts +9 -0
  40. package/dist/headless-room-geometry.d.ts.map +1 -0
  41. package/dist/headless-room-geometry.js +66 -0
  42. package/dist/headless-room-geometry.js.map +1 -0
  43. package/dist/protocol/types.d.ts +1 -0
  44. package/dist/protocol/types.d.ts.map +1 -1
  45. package/dist/resources/providers.d.ts.map +1 -1
  46. package/dist/resources/providers.js +10 -1
  47. package/dist/resources/providers.js.map +1 -1
  48. package/dist/server.d.ts.map +1 -1
  49. package/dist/server.js +5 -17
  50. package/dist/server.js.map +1 -1
  51. package/dist/session-cleanup.d.ts +5 -0
  52. package/dist/session-cleanup.d.ts.map +1 -0
  53. package/dist/session-cleanup.js +36 -0
  54. package/dist/session-cleanup.js.map +1 -0
  55. package/dist/test/live-tool-session.d.ts +9 -0
  56. package/dist/test/live-tool-session.d.ts.map +1 -0
  57. package/dist/test/live-tool-session.js +30 -0
  58. package/dist/test/live-tool-session.js.map +1 -0
  59. package/dist/tools/bcf.js +2 -2
  60. package/dist/tools/bcf.js.map +1 -1
  61. package/dist/tools/copy-elements.d.ts +4 -0
  62. package/dist/tools/copy-elements.d.ts.map +1 -0
  63. package/dist/tools/copy-elements.js +76 -0
  64. package/dist/tools/copy-elements.js.map +1 -0
  65. package/dist/tools/design-place.d.ts +3 -0
  66. package/dist/tools/design-place.d.ts.map +1 -0
  67. package/dist/tools/design-place.js +79 -0
  68. package/dist/tools/design-place.js.map +1 -0
  69. package/dist/tools/discovery.js +3 -3
  70. package/dist/tools/discovery.js.map +1 -1
  71. package/dist/tools/export.js +7 -7
  72. package/dist/tools/export.js.map +1 -1
  73. package/dist/tools/flow-ai.d.ts +6 -0
  74. package/dist/tools/flow-ai.d.ts.map +1 -0
  75. package/dist/tools/flow-ai.js +23 -0
  76. package/dist/tools/flow-ai.js.map +1 -0
  77. package/dist/tools/flow-host.d.ts +1 -1
  78. package/dist/tools/flow-host.d.ts.map +1 -1
  79. package/dist/tools/flow-host.js +5 -1
  80. package/dist/tools/flow-host.js.map +1 -1
  81. package/dist/tools/flow-review-host.d.ts +28 -0
  82. package/dist/tools/flow-review-host.d.ts.map +1 -0
  83. package/dist/tools/flow-review-host.js +142 -0
  84. package/dist/tools/flow-review-host.js.map +1 -0
  85. package/dist/tools/flow.d.ts.map +1 -1
  86. package/dist/tools/flow.js +143 -99
  87. package/dist/tools/flow.js.map +1 -1
  88. package/dist/tools/hosted-edit.d.ts +4 -0
  89. package/dist/tools/hosted-edit.d.ts.map +1 -0
  90. package/dist/tools/hosted-edit.js +37 -0
  91. package/dist/tools/hosted-edit.js.map +1 -0
  92. package/dist/tools/ids-accessor.d.ts +2 -1
  93. package/dist/tools/ids-accessor.d.ts.map +1 -1
  94. package/dist/tools/ids-accessor.js.map +1 -1
  95. package/dist/tools/ids-authoring-model.d.ts +3 -0
  96. package/dist/tools/ids-authoring-model.d.ts.map +1 -0
  97. package/dist/tools/ids-authoring-model.js +112 -0
  98. package/dist/tools/ids-authoring-model.js.map +1 -0
  99. package/dist/tools/ids-authoring.d.ts +3 -0
  100. package/dist/tools/ids-authoring.d.ts.map +1 -0
  101. package/dist/tools/ids-authoring.js +202 -0
  102. package/dist/tools/ids-authoring.js.map +1 -0
  103. package/dist/tools/ids-schema.d.ts +3 -0
  104. package/dist/tools/ids-schema.d.ts.map +1 -0
  105. package/dist/tools/ids-schema.js +91 -0
  106. package/dist/tools/ids-schema.js.map +1 -0
  107. package/dist/tools/index.d.ts +5 -2
  108. package/dist/tools/index.d.ts.map +1 -1
  109. package/dist/tools/index.js +8 -2
  110. package/dist/tools/index.js.map +1 -1
  111. package/dist/tools/layer-store.d.ts +2 -0
  112. package/dist/tools/layer-store.d.ts.map +1 -1
  113. package/dist/tools/layer-store.js +4 -0
  114. package/dist/tools/layer-store.js.map +1 -1
  115. package/dist/tools/mutate.d.ts.map +1 -1
  116. package/dist/tools/mutate.js +12 -2
  117. package/dist/tools/mutate.js.map +1 -1
  118. package/dist/tools/mutation-undo.d.ts.map +1 -1
  119. package/dist/tools/mutation-undo.js +3 -0
  120. package/dist/tools/mutation-undo.js.map +1 -1
  121. package/dist/tools/physical-edit.d.ts +4 -0
  122. package/dist/tools/physical-edit.d.ts.map +1 -0
  123. package/dist/tools/physical-edit.js +77 -0
  124. package/dist/tools/physical-edit.js.map +1 -0
  125. package/dist/tools/query-tools.d.ts +3 -0
  126. package/dist/tools/query-tools.d.ts.map +1 -0
  127. package/dist/tools/query-tools.js +8 -0
  128. package/dist/tools/query-tools.js.map +1 -0
  129. package/dist/tools/query.d.ts +1 -1
  130. package/dist/tools/query.d.ts.map +1 -1
  131. package/dist/tools/query.js +4 -4
  132. package/dist/tools/query.js.map +1 -1
  133. package/dist/tools/room-command.d.ts +6 -0
  134. package/dist/tools/room-command.d.ts.map +1 -0
  135. package/dist/tools/room-command.js +75 -0
  136. package/dist/tools/room-command.js.map +1 -0
  137. package/dist/tools/util.d.ts +10 -0
  138. package/dist/tools/util.d.ts.map +1 -1
  139. package/dist/tools/util.js +13 -1
  140. package/dist/tools/util.js.map +1 -1
  141. package/dist/tools/validation.d.ts +9 -0
  142. package/dist/tools/validation.d.ts.map +1 -1
  143. package/dist/tools/validation.js +3 -3
  144. package/dist/tools/validation.js.map +1 -1
  145. package/dist/transport/http-helpers.d.ts +85 -0
  146. package/dist/transport/http-helpers.d.ts.map +1 -0
  147. package/dist/transport/http-helpers.js +149 -0
  148. package/dist/transport/http-helpers.js.map +1 -0
  149. package/dist/transport/http.d.ts +14 -1
  150. package/dist/transport/http.d.ts.map +1 -1
  151. package/dist/transport/http.js +80 -90
  152. package/dist/transport/http.js.map +1 -1
  153. package/dist/validate.d.ts +1 -1
  154. package/dist/validate.js +3 -0
  155. package/dist/validate.js.map +1 -1
  156. package/package.json +22 -19
@@ -145,10 +145,22 @@ export function okResult(text, structured) {
145
145
  }
146
146
  return { content };
147
147
  }
148
+ /**
149
+ * A number for tool TEXT, grouped the en-US way (`2,500`) on every host.
150
+ *
151
+ * `toLocaleString()` with no argument follows the host's `LC_ALL` / `LANG`, so
152
+ * the same tool call answered `2 500` on a Swedish machine and `2.500` on a
153
+ * German one (#7027). Tool text is English prose read by a model and a person;
154
+ * its numbers are en-US wherever the server runs. Machine-read values do not
155
+ * come through here: they travel as plain numbers in `structuredContent`.
156
+ */
157
+ export function fmtInt(n) {
158
+ return n.toLocaleString('en-US');
159
+ }
148
160
  export function fmtCount(n, singular, plural) {
149
161
  if (n === 1)
150
162
  return `1 ${singular}`;
151
- return `${n.toLocaleString()} ${plural ?? singular + 's'}`;
163
+ return `${fmtInt(n)} ${plural ?? singular + 's'}`;
152
164
  }
153
165
  /** Slice a large array down to `limit` and return `{ items, truncated }`. */
154
166
  export function paginate(items, limit, offset = 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/tools/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/tools/util.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,12 @@
1
1
  import type { Tool } from './types.js';
2
+ import type { ToolContext } from '../context.js';
3
+ /**
4
+ * Resolve IDS source from `ids_xml` (inline) or `ids_path` (disk),
5
+ * enforcing the optional `allowedPaths` allowlist on disk reads. Shared by
6
+ * `ids_validate` and `ids_explain` so both tools apply identical guards;
7
+ * the previous arrangement let `ids_explain` read arbitrary paths in
8
+ * restricted stdio deployments.
9
+ */
10
+ export declare function loadIdsXml(input: Record<string, unknown>, ctx: ToolContext): Promise<string>;
2
11
  export declare const validationTools: Tool[];
3
12
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA+TvC,eAAO,MAAM,eAAe,EAAE,IAAI,EAAwD,CAAC"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAiDjD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,MAAM,CAAC,CAUjB;AAsPD,eAAO,MAAM,eAAe,EAAE,IAAI,EAAwD,CAAC"}
@@ -17,7 +17,7 @@ import { foldedTypeCounts, pendingMutationsField, pendingOverlay, stepText } fro
17
17
  import { effectiveSourceIds, pendingEntityMembership } from '../effective-entity-membership.js';
18
18
  import { isProductType } from '../backend-query.js';
19
19
  import { EntityNode } from '@ifc-lite/query';
20
- import { okResult, resolveModel } from './util.js';
20
+ import { fmtInt, okResult, resolveModel } from './util.js';
21
21
  import { ToolErrorCode, ToolExecutionError } from '../errors.js';
22
22
  import { resolveSafePath } from '../safe-path.js';
23
23
  import { buildIdsAccessor } from './ids-accessor.js';
@@ -63,7 +63,7 @@ const idsValidate = {
63
63
  * the previous arrangement let `ids_explain` read arbitrary paths in
64
64
  * restricted stdio deployments.
65
65
  */
66
- async function loadIdsXml(input, ctx) {
66
+ export async function loadIdsXml(input, ctx) {
67
67
  if (typeof input.ids_xml === 'string')
68
68
  return input.ids_xml;
69
69
  if (typeof input.ids_path === 'string') {
@@ -245,7 +245,7 @@ const modelAudit = {
245
245
  if (unnamed > 0) {
246
246
  issues.push({
247
247
  severity: 'warning', category: 'data-quality', rule: 'has-name', entityCount: unnamed,
248
- message: `${unnamed.toLocaleString()} of ${totalProducts.toLocaleString()} entities have no Name attribute.`,
248
+ message: `${fmtInt(unnamed)} of ${fmtInt(totalProducts)} entities have no Name attribute.`,
249
249
  });
250
250
  }
251
251
  // 4. Semantic drop census (#4208): classes the loader silently skipped.
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /** Request-level helpers for the Streamable HTTP transport (`http.ts`). */
2
+ import type { IncomingMessage, ServerResponse } from 'node:http';
3
+ import type { AuthScope } from '../auth/scope.js';
4
+ /**
5
+ * Strict scope identity check used when reusing an HTTP session — both the
6
+ * permission set and any narrowing (model_ids, user, session) must match
7
+ * what the session was created with. We sort the scopes set so callers
8
+ * that pass them in different orders still compare equal.
9
+ */
10
+ export declare function sameScope(a: AuthScope, b: AuthScope): boolean;
11
+ /**
12
+ * Reflect CORS headers ONLY when the request carries an Origin we explicitly
13
+ * allow. We never emit a wildcard `Access-Control-Allow-Origin` — that would
14
+ * let any web page read JSON-RPC responses cross-origin. When `origin` is not
15
+ * allowlisted we emit no CORS headers, so the browser blocks the response.
16
+ */
17
+ export declare function setCors(res: ServerResponse, origin: string | undefined, allowed: Set<string>): void;
18
+ /**
19
+ * Extract the host name from a `Host` header, stripping the port. Handles the
20
+ * bracketed IPv6 literal form (`[::1]:8765` -> `::1`).
21
+ */
22
+ export declare function parseHostHeader(raw: string | undefined): string | undefined;
23
+ export interface SessionCapacityOptions {
24
+ /**
25
+ * Most concurrent sessions, counting sessions whose `sessionFactory.build`
26
+ * is still pending. `initialize` is the only request that creates one and
27
+ * nothing but a `DELETE` removed it, so a client that never ends its
28
+ * sessions (or a loop of `initialize` calls) grew the map, and the
29
+ * per-session `MCPServer` and layer workspace behind it, without limit. At
30
+ * the cap one reclaimable session (see `sessionIdleMs`) is ended to make
31
+ * room; if there is none the new `initialize` is refused with 503
32
+ * `session-capacity`. Default 1000, the session allowance the cloud and
33
+ * Autodesk services in this repo already use.
34
+ */
35
+ maxSessions?: number;
36
+ /**
37
+ * How long a session must have been inactive before it may be reclaimed to
38
+ * make room at `maxSessions`. Reclaiming happens only under that pressure,
39
+ * never on a timer, and only for a session that also holds no unpublished
40
+ * layer drafts, has no request in flight and has no open SSE stream. The
41
+ * clock restarts when a request settles and when a stream closes. A session
42
+ * holding drafts is never ended for another client, however long it has
43
+ * been inactive: only its owner's `DELETE` (or `close()`) disposes drafts.
44
+ * Default 30 minutes, the idle window those same services use.
45
+ */
46
+ sessionIdleMs?: number;
47
+ }
48
+ /**
49
+ * Refuse limits that would silently disable the policy: with `NaN` every
50
+ * comparison is false, so `maxSessions: NaN` never caps and `sessionIdleMs: NaN`
51
+ * lets a session be reclaimed at once.
52
+ */
53
+ export declare function assertSessionLimits(opts: SessionCapacityOptions): void;
54
+ export declare const DEFAULT_MAX_SESSIONS = 1000;
55
+ export declare const DEFAULT_SESSION_IDLE_MS: number;
56
+ /**
57
+ * The structural slice of `http.ts`'s `Session` the reclaim policy reads.
58
+ */
59
+ export interface ReclaimableSession {
60
+ sseClients: {
61
+ size: number;
62
+ };
63
+ /** Requests currently being handled. */
64
+ inFlight: number;
65
+ lastSeen: number;
66
+ }
67
+ /**
68
+ * Pick up to `need` sessions that are safe to end, oldest `lastSeen` first.
69
+ * Safe means all four hold: no open SSE stream, no request in flight, inactive
70
+ * for at least `idleMs`, and no unpublished layer drafts. Ending a session
71
+ * destroys its drafts and they cannot be recovered, so one that holds any is
72
+ * never a candidate. Single O(n) scan; allocates only for sessions that qualify.
73
+ */
74
+ export declare function pickReclaimable(sessions: ReadonlyMap<string, ReclaimableSession>, idleMs: number, need: number, draftCount: (id: string) => number, now?: number): string[];
75
+ /** 503 for an `initialize` at the session limit when no session can be ended safely. */
76
+ export declare function sendSessionCapacity(res: ServerResponse): void;
77
+ /** 404 for a session id we do not hold; tells the client why it may be gone and what to do. */
78
+ export declare function sendUnknownSession(res: ServerResponse): void;
79
+ export declare function writeSse(res: ServerResponse, message: unknown): void;
80
+ /** Reads the request body; `holder` counts as busy while the upload runs and active when it ends, however it ends. */
81
+ export declare function readBody(req: IncomingMessage, max: number, holder?: {
82
+ inFlight: number;
83
+ lastSeen: number;
84
+ }): Promise<string>;
85
+ //# sourceMappingURL=http-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-helpers.d.ts","sourceRoot":"","sources":["../../src/transport/http-helpers.ts"],"names":[],"mappings":"AAIA,2EAA2E;AAE3E,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAW7D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAOnG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQ3E;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI,CAQtE;AAED,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,uBAAuB,QAAc,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,EACjD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EAClC,GAAG,GAAE,MAAmB,GACvB,MAAM,EAAE,CAYV;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAO7D;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAO5D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAEpE;AAED,sHAAsH;AACtH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlI"}
@@ -0,0 +1,149 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Strict scope identity check used when reusing an HTTP session — both the
6
+ * permission set and any narrowing (model_ids, user, session) must match
7
+ * what the session was created with. We sort the scopes set so callers
8
+ * that pass them in different orders still compare equal.
9
+ */
10
+ export function sameScope(a, b) {
11
+ if (a === b)
12
+ return true;
13
+ if (a.user !== b.user || a.session !== b.session)
14
+ return false;
15
+ const as = [...a.scopes].sort();
16
+ const bs = [...b.scopes].sort();
17
+ if (as.length !== bs.length || as.some((s, i) => s !== bs[i]))
18
+ return false;
19
+ const am = a.modelIds ? [...a.modelIds].sort() : undefined;
20
+ const bm = b.modelIds ? [...b.modelIds].sort() : undefined;
21
+ if ((am?.length ?? 0) !== (bm?.length ?? 0))
22
+ return false;
23
+ if (am && bm && am.some((m, i) => m !== bm[i]))
24
+ return false;
25
+ return true;
26
+ }
27
+ /**
28
+ * Reflect CORS headers ONLY when the request carries an Origin we explicitly
29
+ * allow. We never emit a wildcard `Access-Control-Allow-Origin` — that would
30
+ * let any web page read JSON-RPC responses cross-origin. When `origin` is not
31
+ * allowlisted we emit no CORS headers, so the browser blocks the response.
32
+ */
33
+ export function setCors(res, origin, allowed) {
34
+ if (!origin || !allowed.has(origin))
35
+ return;
36
+ res.setHeader('Access-Control-Allow-Origin', origin);
37
+ res.setHeader('Vary', 'Origin');
38
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
39
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Mcp-Session-Id');
40
+ res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
41
+ }
42
+ /**
43
+ * Extract the host name from a `Host` header, stripping the port. Handles the
44
+ * bracketed IPv6 literal form (`[::1]:8765` -> `::1`).
45
+ */
46
+ export function parseHostHeader(raw) {
47
+ if (!raw)
48
+ return undefined;
49
+ const value = raw.trim();
50
+ if (value.startsWith('[')) {
51
+ const end = value.indexOf(']');
52
+ return end > 0 ? value.slice(1, end) : value;
53
+ }
54
+ return value.split(':')[0];
55
+ }
56
+ /**
57
+ * Refuse limits that would silently disable the policy: with `NaN` every
58
+ * comparison is false, so `maxSessions: NaN` never caps and `sessionIdleMs: NaN`
59
+ * lets a session be reclaimed at once.
60
+ */
61
+ export function assertSessionLimits(opts) {
62
+ const { maxSessions, sessionIdleMs } = opts;
63
+ if (maxSessions !== undefined && !(Number.isInteger(maxSessions) && maxSessions >= 1)) {
64
+ throw new RangeError(`maxSessions must be an integer >= 1, got ${String(maxSessions)}`);
65
+ }
66
+ if (sessionIdleMs !== undefined && !(Number.isFinite(sessionIdleMs) && sessionIdleMs >= 0)) {
67
+ throw new RangeError(`sessionIdleMs must be a finite number >= 0, got ${String(sessionIdleMs)}`);
68
+ }
69
+ }
70
+ export const DEFAULT_MAX_SESSIONS = 1000;
71
+ export const DEFAULT_SESSION_IDLE_MS = 30 * 60_000;
72
+ /**
73
+ * Pick up to `need` sessions that are safe to end, oldest `lastSeen` first.
74
+ * Safe means all four hold: no open SSE stream, no request in flight, inactive
75
+ * for at least `idleMs`, and no unpublished layer drafts. Ending a session
76
+ * destroys its drafts and they cannot be recovered, so one that holds any is
77
+ * never a candidate. Single O(n) scan; allocates only for sessions that qualify.
78
+ */
79
+ export function pickReclaimable(sessions, idleMs, need, draftCount, now = Date.now()) {
80
+ if (need <= 0)
81
+ return [];
82
+ const safe = [];
83
+ for (const [id, s] of sessions) {
84
+ if (s.sseClients.size > 0)
85
+ continue;
86
+ if (s.inFlight > 0)
87
+ continue;
88
+ if (now - s.lastSeen < idleMs)
89
+ continue;
90
+ if (draftCount(id) > 0)
91
+ continue;
92
+ safe.push({ id, lastSeen: s.lastSeen });
93
+ }
94
+ safe.sort((x, y) => x.lastSeen - y.lastSeen);
95
+ return safe.slice(0, need).map((c) => c.id);
96
+ }
97
+ /** 503 for an `initialize` at the session limit when no session can be ended safely. */
98
+ export function sendSessionCapacity(res) {
99
+ res.statusCode = 503;
100
+ res.setHeader('Content-Type', 'application/json');
101
+ res.end(JSON.stringify({
102
+ error: 'session-capacity',
103
+ message: 'The server is at its session limit and no session can be ended safely: every one is recently active, has a request in flight or an open event stream, or holds unpublished layer drafts. No session was ended. End a session you no longer need with DELETE, or retry later.',
104
+ }));
105
+ }
106
+ /** 404 for a session id we do not hold; tells the client why it may be gone and what to do. */
107
+ export function sendUnknownSession(res) {
108
+ res.statusCode = 404;
109
+ res.setHeader('Content-Type', 'application/json');
110
+ res.end(JSON.stringify({
111
+ error: 'unknown-session',
112
+ message: 'Unknown session. It was ended with DELETE, or the server ended it after it sat idle, holding no unpublished layer drafts, while the server was at its session limit. Send initialize without Mcp-Session-Id to start a new session.',
113
+ }));
114
+ }
115
+ export function writeSse(res, message) {
116
+ res.write(`data: ${JSON.stringify(message)}\n\n`);
117
+ }
118
+ /** Reads the request body; `holder` counts as busy while the upload runs and active when it ends, however it ends. */
119
+ export async function readBody(req, max, holder) {
120
+ if (holder)
121
+ holder.inFlight++;
122
+ try {
123
+ return await readBodyChunks(req, max);
124
+ }
125
+ finally {
126
+ if (holder) {
127
+ holder.inFlight--;
128
+ holder.lastSeen = Date.now();
129
+ }
130
+ }
131
+ }
132
+ function readBodyChunks(req, max) {
133
+ return new Promise((resolve, reject) => {
134
+ let total = 0;
135
+ const chunks = [];
136
+ req.on('data', (chunk) => {
137
+ total += chunk.length;
138
+ if (total > max) {
139
+ reject(new Error('Request body too large'));
140
+ req.destroy();
141
+ return;
142
+ }
143
+ chunks.push(chunk);
144
+ });
145
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
146
+ req.on('error', reject);
147
+ });
148
+ }
149
+ //# sourceMappingURL=http-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-helpers.js","sourceRoot":"","sources":["../../src/transport/http-helpers.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@
19
19
  import { IncomingMessage } from 'node:http';
20
20
  import { MCPServer } from '../server.js';
21
21
  import { AuthScope } from '../auth/scope.js';
22
+ import { type SessionCapacityOptions } from './http-helpers.js';
22
23
  export interface HttpAuthenticator {
23
24
  /**
24
25
  * Called for every inbound request. Returns the auth scope for the caller,
@@ -38,7 +39,7 @@ export interface SessionFactory {
38
39
  */
39
40
  build(scope: AuthScope, sessionId: string): Promise<MCPServer> | MCPServer;
40
41
  }
41
- export interface HttpTransportOptions {
42
+ export interface HttpTransportOptions extends SessionCapacityOptions {
42
43
  port: number;
43
44
  host?: string;
44
45
  authenticator: HttpAuthenticator;
@@ -56,6 +57,8 @@ export interface HttpTransportOptions {
56
57
  export declare class HttpTransport {
57
58
  private server;
58
59
  private sessions;
60
+ /** Sessions whose factory call is in flight: not yet in `sessions`, but already spoken for. */
61
+ private building;
59
62
  private opts;
60
63
  /** Browser Origins permitted to read responses (empty = none). */
61
64
  private allowedOrigins;
@@ -74,7 +77,17 @@ export declare class HttpTransport {
74
77
  port(): number | undefined;
75
78
  close(): Promise<void>;
76
79
  private handle;
80
+ /** Run one message; the session counts as busy until it settles, and active when it does. */
81
+ private dispatch;
77
82
  private openSse;
83
+ /** An open stream keeps its session from being reclaimed; idle time starts when it closes. */
84
+ private trackSse;
85
+ /**
86
+ * Whether a new session fits. Live sessions and pending builds both count.
87
+ * At the cap, only a session that is safe to end (see `pickReclaimable`)
88
+ * makes room; with none, the answer is no and nothing is ended.
89
+ */
90
+ private makeRoomForSession;
78
91
  private endSession;
79
92
  private makeSinkFor;
80
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAgB,eAAe,EAA0B,MAAM,WAAW,CAAC;AAKlF,OAAO,EAAE,SAAS,EAAuB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;CAClF;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;;;;OAQG;IACH,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;CAC5E;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,iBAAiB,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAUD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,IAAI,CAAuB;IACnC,kEAAkE;IAClE,OAAO,CAAC,cAAc,CAAc;IACpC,4DAA4D;IAC5D,OAAO,CAAC,YAAY,CAAc;IAClC;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB,CAAU;gBAEtB,IAAI,EAAE,oBAAoB;IA6BtC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvB,wEAAwE;IACxE,IAAI,IAAI,MAAM,GAAG,SAAS;IAK1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAWR,MAAM;IAkJpB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;CAUpB;AA0ED,qBAAa,eAAgB,YAAW,iBAAiB;IAC3C,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IAElD,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI;CAMrD;AAED,4EAA4E;AAC5E,qBAAa,YAAa,YAAW,iBAAiB;IACxC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,SAAS;IACpC,YAAY,IAAI,SAAS;CAC1B"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAgB,eAAe,EAA0B,MAAM,WAAW,CAAC;AAKlF,OAAO,EAAE,SAAS,EAAuB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAyL,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEvP,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;CAClF;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;;;;OAQG;IACH,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;CAC5E;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,iBAAiB,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAaD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,+FAA+F;IAC/F,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,IAAI,CAAuB;IACnC,kEAAkE;IAClE,OAAO,CAAC,cAAc,CAAc;IACpC,4DAA4D;IAC5D,OAAO,CAAC,YAAY,CAAc;IAClC;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB,CAAU;gBAEtB,IAAI,EAAE,oBAAoB;IA8BtC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvB,wEAAwE;IACxE,IAAI,IAAI,MAAM,GAAG,SAAS;IAK1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAWR,MAAM;IAkKpB,6FAA6F;YAC/E,QAAQ;IAUtB,OAAO,CAAC,OAAO;IAWf,8FAA8F;IAC9F,OAAO,CAAC,QAAQ;IAQhB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;CAYpB;AAID,qBAAa,eAAgB,YAAW,iBAAiB;IAC3C,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IAElD,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI;CAMrD;AAED,4EAA4E;AAC5E,qBAAa,YAAa,YAAW,iBAAiB;IACxC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,SAAS;IACpC,YAAY,IAAI,SAAS;CAC1B"}