@novorb/mcp-core 2.1.1 → 3.0.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.
Files changed (240) hide show
  1. package/README.md +82 -161
  2. package/bin/mcp-core-jest.mjs +112 -0
  3. package/dist/auth.d.ts +57 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +74 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/bootstrap.d.ts +129 -0
  8. package/dist/bootstrap.d.ts.map +1 -0
  9. package/dist/bootstrap.js +206 -0
  10. package/dist/bootstrap.js.map +1 -0
  11. package/dist/client-input.d.ts +72 -0
  12. package/dist/client-input.d.ts.map +1 -0
  13. package/dist/client-input.js +109 -0
  14. package/dist/client-input.js.map +1 -0
  15. package/dist/credential-checks.d.ts +80 -0
  16. package/dist/credential-checks.d.ts.map +1 -0
  17. package/dist/credential-checks.js +189 -0
  18. package/dist/credential-checks.js.map +1 -0
  19. package/dist/credential-health.d.ts +12 -0
  20. package/dist/credential-health.d.ts.map +1 -0
  21. package/dist/credential-health.js +12 -0
  22. package/dist/credential-health.js.map +1 -0
  23. package/dist/credential-report.d.ts +46 -0
  24. package/dist/credential-report.d.ts.map +1 -0
  25. package/dist/credential-report.js +135 -0
  26. package/dist/credential-report.js.map +1 -0
  27. package/dist/credential-status-tool.d.ts +20 -0
  28. package/dist/credential-status-tool.d.ts.map +1 -0
  29. package/dist/credential-status-tool.js +33 -0
  30. package/dist/credential-status-tool.js.map +1 -0
  31. package/dist/credentials.d.ts +288 -0
  32. package/dist/credentials.d.ts.map +1 -0
  33. package/dist/credentials.js +652 -0
  34. package/dist/credentials.js.map +1 -0
  35. package/dist/express-peers.d.ts +29 -0
  36. package/dist/express-peers.d.ts.map +1 -0
  37. package/dist/express-peers.js +36 -0
  38. package/dist/express-peers.js.map +1 -0
  39. package/dist/express.d.ts +74 -0
  40. package/dist/express.d.ts.map +1 -0
  41. package/dist/express.js +164 -0
  42. package/dist/express.js.map +1 -0
  43. package/dist/http-client.d.ts +278 -43
  44. package/dist/http-client.d.ts.map +1 -1
  45. package/dist/http-client.js +620 -182
  46. package/dist/http-client.js.map +1 -1
  47. package/dist/index.d.ts +27 -6
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +49 -10
  50. package/dist/index.js.map +1 -1
  51. package/dist/limits.d.ts +28 -0
  52. package/dist/limits.d.ts.map +1 -0
  53. package/dist/limits.js +37 -0
  54. package/dist/limits.js.map +1 -0
  55. package/dist/list-pagination.d.ts +41 -0
  56. package/dist/list-pagination.d.ts.map +1 -0
  57. package/dist/list-pagination.js +104 -0
  58. package/dist/list-pagination.js.map +1 -0
  59. package/dist/net.d.ts +112 -0
  60. package/dist/net.d.ts.map +1 -0
  61. package/dist/net.js +490 -0
  62. package/dist/net.js.map +1 -0
  63. package/dist/notifications.d.ts +78 -0
  64. package/dist/notifications.d.ts.map +1 -0
  65. package/dist/notifications.js +173 -0
  66. package/dist/notifications.js.map +1 -0
  67. package/dist/pagination.d.ts +236 -5
  68. package/dist/pagination.d.ts.map +1 -1
  69. package/dist/pagination.js +393 -6
  70. package/dist/pagination.js.map +1 -1
  71. package/dist/prompts.d.ts +70 -0
  72. package/dist/prompts.d.ts.map +1 -0
  73. package/dist/prompts.js +109 -0
  74. package/dist/prompts.js.map +1 -0
  75. package/dist/protocol-errors.d.ts +15 -0
  76. package/dist/protocol-errors.d.ts.map +1 -0
  77. package/dist/protocol-errors.js +28 -0
  78. package/dist/protocol-errors.js.map +1 -0
  79. package/dist/protocol-logging.d.ts +37 -0
  80. package/dist/protocol-logging.d.ts.map +1 -0
  81. package/dist/protocol-logging.js +77 -0
  82. package/dist/protocol-logging.js.map +1 -0
  83. package/dist/rate-limiter.d.ts +36 -0
  84. package/dist/rate-limiter.d.ts.map +1 -0
  85. package/dist/rate-limiter.js +79 -0
  86. package/dist/rate-limiter.js.map +1 -0
  87. package/dist/request-state.d.ts +74 -0
  88. package/dist/request-state.d.ts.map +1 -0
  89. package/dist/request-state.js +190 -0
  90. package/dist/request-state.js.map +1 -0
  91. package/dist/resources.d.ts +181 -0
  92. package/dist/resources.d.ts.map +1 -0
  93. package/dist/resources.js +302 -0
  94. package/dist/resources.js.map +1 -0
  95. package/dist/result-limits.d.ts +80 -0
  96. package/dist/result-limits.d.ts.map +1 -0
  97. package/dist/result-limits.js +248 -0
  98. package/dist/result-limits.js.map +1 -0
  99. package/dist/retry.d.ts +79 -23
  100. package/dist/retry.d.ts.map +1 -1
  101. package/dist/retry.js +170 -57
  102. package/dist/retry.js.map +1 -1
  103. package/dist/sdk/client-stdio.d.ts +6 -0
  104. package/dist/sdk/client-stdio.d.ts.map +1 -0
  105. package/dist/sdk/client-stdio.js +6 -0
  106. package/dist/sdk/client-stdio.js.map +1 -0
  107. package/dist/sdk/client.d.ts +6 -0
  108. package/dist/sdk/client.d.ts.map +1 -0
  109. package/dist/sdk/client.js +6 -0
  110. package/dist/sdk/client.js.map +1 -0
  111. package/dist/sdk/express.d.ts +3 -0
  112. package/dist/sdk/express.d.ts.map +1 -0
  113. package/dist/sdk/express.js +11 -0
  114. package/dist/sdk/express.js.map +1 -0
  115. package/dist/sdk/node.d.ts +6 -0
  116. package/dist/sdk/node.d.ts.map +1 -0
  117. package/dist/sdk/node.js +6 -0
  118. package/dist/sdk/node.js.map +1 -0
  119. package/dist/sdk/server-stdio.d.ts +6 -0
  120. package/dist/sdk/server-stdio.d.ts.map +1 -0
  121. package/dist/sdk/server-stdio.js +6 -0
  122. package/dist/sdk/server-stdio.js.map +1 -0
  123. package/dist/sdk/server.d.ts +6 -0
  124. package/dist/sdk/server.d.ts.map +1 -0
  125. package/dist/sdk/server.js +6 -0
  126. package/dist/sdk/server.js.map +1 -0
  127. package/dist/server.d.ts +88 -36
  128. package/dist/server.d.ts.map +1 -1
  129. package/dist/server.js +98 -44
  130. package/dist/server.js.map +1 -1
  131. package/dist/task-request.d.ts +20 -0
  132. package/dist/task-request.d.ts.map +1 -0
  133. package/dist/task-request.js +43 -0
  134. package/dist/task-request.js.map +1 -0
  135. package/dist/task-store.d.ts +230 -0
  136. package/dist/task-store.d.ts.map +1 -0
  137. package/dist/task-store.js +459 -0
  138. package/dist/task-store.js.map +1 -0
  139. package/dist/task-tools.d.ts +115 -0
  140. package/dist/task-tools.d.ts.map +1 -0
  141. package/dist/task-tools.js +397 -0
  142. package/dist/task-tools.js.map +1 -0
  143. package/dist/testing/client.d.ts +25 -0
  144. package/dist/testing/client.d.ts.map +1 -0
  145. package/dist/testing/client.js +11 -0
  146. package/dist/testing/client.js.map +1 -0
  147. package/dist/testing/in-memory.d.ts +26 -0
  148. package/dist/testing/in-memory.d.ts.map +1 -0
  149. package/dist/testing/in-memory.js +41 -0
  150. package/dist/testing/in-memory.js.map +1 -0
  151. package/dist/testing/index.d.ts +20 -0
  152. package/dist/testing/index.d.ts.map +1 -0
  153. package/dist/testing/index.js +20 -0
  154. package/dist/testing/index.js.map +1 -0
  155. package/dist/testing/isolated-dirs.d.ts +27 -0
  156. package/dist/testing/isolated-dirs.d.ts.map +1 -0
  157. package/dist/testing/isolated-dirs.js +67 -0
  158. package/dist/testing/isolated-dirs.js.map +1 -0
  159. package/dist/testing/logs.d.ts +61 -0
  160. package/dist/testing/logs.d.ts.map +1 -0
  161. package/dist/testing/logs.js +113 -0
  162. package/dist/testing/logs.js.map +1 -0
  163. package/dist/testing/raw-http.d.ts +25 -0
  164. package/dist/testing/raw-http.d.ts.map +1 -0
  165. package/dist/testing/raw-http.js +41 -0
  166. package/dist/testing/raw-http.js.map +1 -0
  167. package/dist/testing/raw-peer.d.ts +43 -0
  168. package/dist/testing/raw-peer.d.ts.map +1 -0
  169. package/dist/testing/raw-peer.js +101 -0
  170. package/dist/testing/raw-peer.js.map +1 -0
  171. package/dist/testing/recording-server.d.ts +38 -0
  172. package/dist/testing/recording-server.d.ts.map +1 -0
  173. package/dist/testing/recording-server.js +38 -0
  174. package/dist/testing/recording-server.js.map +1 -0
  175. package/dist/testing/server-process.d.ts +76 -0
  176. package/dist/testing/server-process.d.ts.map +1 -0
  177. package/dist/testing/server-process.js +241 -0
  178. package/dist/testing/server-process.js.map +1 -0
  179. package/dist/testing/tools.d.ts +53 -0
  180. package/dist/testing/tools.d.ts.map +1 -0
  181. package/dist/testing/tools.js +98 -0
  182. package/dist/testing/tools.js.map +1 -0
  183. package/dist/testing/unit.d.ts +52 -0
  184. package/dist/testing/unit.d.ts.map +1 -0
  185. package/dist/testing/unit.js +95 -0
  186. package/dist/testing/unit.js.map +1 -0
  187. package/dist/tools.d.ts +205 -0
  188. package/dist/tools.d.ts.map +1 -0
  189. package/dist/tools.js +370 -0
  190. package/dist/tools.js.map +1 -0
  191. package/dist/transport.d.ts +144 -53
  192. package/dist/transport.d.ts.map +1 -1
  193. package/dist/transport.js +305 -122
  194. package/dist/transport.js.map +1 -1
  195. package/dist/url-path.d.ts +49 -0
  196. package/dist/url-path.d.ts.map +1 -0
  197. package/dist/url-path.js +165 -0
  198. package/dist/url-path.js.map +1 -0
  199. package/dist/utils/dataStore.d.ts +143 -0
  200. package/dist/utils/dataStore.d.ts.map +1 -0
  201. package/dist/utils/dataStore.js +429 -0
  202. package/dist/utils/dataStore.js.map +1 -0
  203. package/dist/utils/envLoader.d.ts +129 -0
  204. package/dist/utils/envLoader.d.ts.map +1 -0
  205. package/dist/utils/envLoader.js +399 -0
  206. package/dist/utils/envLoader.js.map +1 -0
  207. package/dist/utils/logger.d.ts +181 -0
  208. package/dist/utils/logger.d.ts.map +1 -0
  209. package/dist/utils/logger.js +664 -0
  210. package/dist/utils/logger.js.map +1 -0
  211. package/dist/utils/redact.d.ts +50 -0
  212. package/dist/utils/redact.d.ts.map +1 -0
  213. package/dist/utils/redact.js +318 -0
  214. package/dist/utils/redact.js.map +1 -0
  215. package/docs/api-reference.md +29 -0
  216. package/docs/building-a-server.md +63 -0
  217. package/docs/credentials.md +131 -0
  218. package/docs/data-store.md +37 -0
  219. package/docs/env.md +38 -0
  220. package/docs/features.md +28 -0
  221. package/docs/http-client.md +116 -0
  222. package/docs/logger.md +100 -0
  223. package/docs/migrating-to-v3.md +45 -0
  224. package/docs/outbound-urls.md +104 -0
  225. package/docs/pagination.md +45 -0
  226. package/docs/protocol-features.md +62 -0
  227. package/docs/resources-prompts-tasks.md +95 -0
  228. package/docs/sdk.md +33 -0
  229. package/docs/server.md +68 -0
  230. package/docs/testing-harness.md +139 -0
  231. package/docs/testing.md +151 -0
  232. package/docs/tools.md +88 -0
  233. package/docs/transport.md +85 -0
  234. package/examples/testing/tools.integration.test.example.ts +312 -0
  235. package/examples/testing/tools.unit.test.example.ts +149 -0
  236. package/package.json +140 -18
  237. package/dist/logger.d.ts +0 -80
  238. package/dist/logger.d.ts.map +0 -1
  239. package/dist/logger.js +0 -236
  240. package/dist/logger.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,EAAgB,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG1E,qEAAqE;AACrE,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAEF,kEAAkE;AAClE,KAAK,eAAe,GAAG,YAAY,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AA8BD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIzE;AAED,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,EACzC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,kBAAkB,CAYpB;AAED,yGAAyG;AACzG,MAAM,WAAW,oBAAoB;IACnC,qGAAqG;IACrG,SAAS,EAAE,MAAM,YAAY,CAAC;IAC9B,6DAA6D;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,4BAA4B,EAAE,OAAO,CAAC;IACtC,gFAAgF;IAChF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kFAAkF;IAClF,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,oBAAoB,GACxB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CA0E9D;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,eAAe,EAAE,eAAe,EAChC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAQf"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
package/dist/transport.js CHANGED
@@ -1,54 +1,73 @@
1
1
  /**
2
- * @novorb/mcp-core — Transport
2
+ * @novorb/mcp-core - Transport
3
3
  *
4
- * Unified transport for MCP servers. Selects between stdio and native Streamable HTTP
5
- * based on the MCP_TRANSPORT environment variable.
4
+ * Unified transport for MCP servers on SDK v2. Selects between stdio and Streamable HTTP from the
5
+ * MCP_TRANSPORT environment variable; both legs take the SAME server factory.
6
6
  *
7
- * HTTP mode is stateless (sessionIdGenerator: undefined) — compatible with MCPize Cloud Run,
8
- * Apify Standby, and any other scale-to-zero host. One transport instance is created per
9
- * request; the server instance is resolved once and reconnected per request (SDK 1.29+).
7
+ * - stdio: `serveStdio(factory)` from `@modelcontextprotocol/server/stdio` (one instance per
8
+ * connection; the client's opening message picks the protocol era).
9
+ * - http: `createMcpHandler(factory, { legacy: 'stateless' })` (the SDK default `responseMode: 'auto'`:
10
+ * one JSON body unless the handler emits progress or log notifications first, then SSE) adapted with
11
+ * `toNodeHandler` from `@modelcontextprotocol/node`, behind mcp-core's own `node:http` server that
12
+ * adds `/health`, the fail-closed Bearer gate (the SDK's `verifyBearerToken` over the static key or a
13
+ * pluggable verifier, `req.auth` set for the SDK), Host/Origin allow-lists and the 415/413 guards.
14
+ * Stateless: a fresh instance per request, 2025-era clients served by the SDK's stateless fallback.
10
15
  *
11
16
  * Usage:
12
17
  * import { startMcpServer } from '@novorb/mcp-core/transport';
18
+ * await startMcpServer(() => buildServer());
13
19
  *
14
- * // Factory (recommended for HTTP — ensures clean state per request):
15
- * await startMcpServer(() => createServer(services));
16
- *
17
- * // Server instance (fine for stdio; also works for HTTP in SDK 1.29+):
18
- * await startMcpServer(server);
19
- *
20
- * Environment variables:
21
- * MCP_TRANSPORT — 'stdio' (default) | 'http'
22
- * PORT — listen port for HTTP transport (default: 8080)
23
- * MCP_HTTP_HOST — bind address for HTTP (default: '0.0.0.0' for container hosts; set
24
- * '127.0.0.1' for local-only)
25
- * MCP_API_KEY — Bearer token for HTTP auth. REQUIRED in HTTP mode unless MCP_AUTH_DISABLED.
26
- * MCP_AUTH_DISABLED — set 'true' to run HTTP WITHOUT auth (only when a gateway/platform fronts it)
27
- * MCP_MAX_BODY_BYTES — max accepted POST body size (default: 4 MiB)
28
- * MCP_ALLOWED_HOSTS — comma-separated Host allowlist; setting it enables DNS-rebinding protection
29
- * MCP_ALLOWED_ORIGINS — comma-separated Origin allowlist (also enables DNS-rebinding protection)
20
+ * Environment variables (an explicit option wins):
21
+ * MCP_TRANSPORT - 'stdio' (default) | 'http'; any other value throws
22
+ * PORT - listen port for HTTP transport (default: 8080)
23
+ * MCP_HTTP_HOST - bind address for HTTP (default: '0.0.0.0'; set '127.0.0.1' for local-only)
24
+ * MCP_API_KEY - Bearer token for HTTP auth. REQUIRED in HTTP mode unless MCP_AUTH_DISABLED or
25
+ * a `verifier` is passed.
26
+ * MCP_AUTH_DISABLED - set 'true' to run HTTP WITHOUT auth (only when a gateway/platform fronts it)
27
+ * MCP_MAX_BODY_BYTES - max accepted POST body size (default: 4 MiB)
28
+ * MCP_ALLOWED_HOSTS - comma-separated Host allowlist; setting it enables DNS-rebinding protection
29
+ * MCP_ALLOWED_ORIGINS - comma-separated Origin allowlist (also enables DNS-rebinding protection)
30
30
  */
31
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
32
- import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
33
- import { createServer } from 'node:http';
34
31
  import { createHash, timingSafeEqual } from 'node:crypto';
35
- function resolve(s) {
36
- return typeof s === 'function' ? s() : s;
32
+ import { createServer } from 'node:http';
33
+ import { hostHeaderValidation, originValidation, toNodeHandler } from '@modelcontextprotocol/node';
34
+ import { createMcpHandler, isJsonContentType, } from '@modelcontextprotocol/server';
35
+ import { serveStdio } from '@modelcontextprotocol/server/stdio';
36
+ import { authenticate, bearerOptions, writeWebResponse } from './auth.js';
37
+ import { attachNotifications, createNotifier, processBus } from './notifications.js';
38
+ import { getLogger } from './utils/logger.js';
39
+ const HTTP_FACTORY_REQUIRED = '[mcp-core] HTTP transport requires a server factory; one McpServer serves one connection in SDK v2';
40
+ /** Default POST body cap (the SDK's own default too). */
41
+ export const DEFAULT_MAX_BODY_BYTES = 4 * 1024 * 1024;
42
+ function reportError(error) {
43
+ const message = error instanceof Error ? error.message : String(error);
44
+ getLogger().error(`request error: ${message}`, 'mcp-core');
37
45
  }
38
46
  /** Marker error so the request handler can answer 413 rather than 500. */
39
47
  class BodyTooLargeError extends Error {
40
- constructor() { super('Request body too large'); this.name = 'BodyTooLargeError'; }
48
+ constructor() {
49
+ super('Request body too large');
50
+ this.name = 'BodyTooLargeError';
51
+ }
41
52
  }
42
- /** Read the request body, rejecting (and destroying the socket) once it exceeds `maxBytes`. */
53
+ /**
54
+ * Read the request body, rejecting once it exceeds `maxBytes`. The rest of the body is drained and
55
+ * discarded (never buffered) instead of destroying the socket, so the client actually receives the 413
56
+ * the handler writes; that response carries `Connection: close`.
57
+ */
43
58
  function readBody(req, maxBytes) {
44
59
  return new Promise((res, rej) => {
45
60
  const chunks = [];
46
61
  let size = 0;
62
+ let tooLarge = false;
47
63
  req.on('data', (c) => {
64
+ if (tooLarge)
65
+ return;
48
66
  size += c.length;
49
67
  if (size > maxBytes) {
68
+ tooLarge = true;
69
+ chunks.length = 0;
50
70
  rej(new BodyTooLargeError());
51
- req.destroy();
52
71
  return;
53
72
  }
54
73
  chunks.push(c);
@@ -57,10 +76,15 @@ function readBody(req, maxBytes) {
57
76
  req.on('error', rej);
58
77
  });
59
78
  }
79
+ function sendJson(res, status, payload, headers = {}) {
80
+ res.writeHead(status, { 'Content-Type': 'application/json', ...headers });
81
+ res.end(JSON.stringify(payload));
82
+ }
60
83
  /**
61
84
  * Constant-time comparison of the Authorization header against `Bearer <apiKey>`.
62
85
  * Both sides are SHA-256-hashed first so `timingSafeEqual` never throws on a length mismatch and the
63
- * token length is not itself a timing oracle.
86
+ * token length is not itself a timing oracle. (The transport itself now verifies through the SDK's
87
+ * `verifyBearerToken` with `apiKeyVerifier`, which compares the same way.)
64
88
  */
65
89
  export function bearerMatches(authHeader, apiKey) {
66
90
  const a = createHash('sha256').update(authHeader).digest();
@@ -68,146 +92,305 @@ export function bearerMatches(authHeader, apiKey) {
68
92
  return timingSafeEqual(a, b);
69
93
  }
70
94
  /**
71
- * Resolve HTTP auth — FAIL CLOSED. `apiKey: null` (programmatic) or MCP_AUTH_DISABLED=true are the
95
+ * Resolve HTTP auth - FAIL CLOSED. `apiKey: null` (programmatic) or MCP_AUTH_DISABLED=true are the
72
96
  * only ways to run open; a missing/empty MCP_API_KEY is treated as "not configured" (not a valid
73
- * empty key) and THROWS, so a config typo can't silently downgrade the endpoint to no-auth.
97
+ * empty key) and THROWS, so a config typo can't silently downgrade the endpoint to no-auth. A passed
98
+ * `auth.verifier` always enforces auth (it wins over every "disabled" switch).
74
99
  */
75
100
  export function resolveHttpAuth(options, env = process.env) {
101
+ if (options.auth?.verifier)
102
+ return { authEnabled: true, apiKey: '' };
76
103
  const explicitlyDisabled = options.apiKey === null || env.MCP_AUTH_DISABLED === 'true';
77
- const apiKey = (options.apiKey !== undefined && options.apiKey !== null)
78
- ? options.apiKey
79
- : (env.MCP_API_KEY || '');
104
+ const apiKey = options.apiKey !== undefined && options.apiKey !== null ? options.apiKey : env.MCP_API_KEY || '';
80
105
  if (!explicitlyDisabled && apiKey.length === 0) {
81
106
  throw new Error('[mcp-core] HTTP transport refused to start without auth: set MCP_API_KEY to a non-empty token, ' +
82
107
  'or set MCP_AUTH_DISABLED=true to run open (only when a gateway/platform fronts authentication).');
83
108
  }
84
109
  return { authEnabled: apiKey.length > 0, apiKey };
85
110
  }
111
+ /** `host` or `host:port` -> the bare hostname the SDK's port-agnostic Host validation compares. */
112
+ export function toHostname(entry) {
113
+ try {
114
+ return new URL(`http://${entry}`).hostname || entry;
115
+ }
116
+ catch {
117
+ return entry;
118
+ }
119
+ }
120
+ /**
121
+ * A full origin (`https://app.example.com:443`) -> its hostname; bare hostnames and `<scheme>://*`
122
+ * entries pass unchanged. The SDK honours a lowercase `<scheme>://*` entry (for example
123
+ * `chrome-extension://*`) as "every origin of that scheme", but never `http://*` or `https://*`.
124
+ */
125
+ export function toOriginHostname(entry) {
126
+ if (/^[a-z][a-z0-9+.-]*:\/\/\*$/i.test(entry))
127
+ return entry;
128
+ if (!entry.includes('://'))
129
+ return toHostname(entry);
130
+ try {
131
+ return new URL(entry).hostname || entry;
132
+ }
133
+ catch {
134
+ return entry;
135
+ }
136
+ }
137
+ /** Split a comma-separated allow-list env value. */
138
+ export function parseList(value) {
139
+ return (value || '')
140
+ .split(',')
141
+ .map((s) => s.trim())
142
+ .filter(Boolean);
143
+ }
144
+ function isMcpPath(url) {
145
+ return url === '/mcp' || (url?.startsWith('/mcp?') ?? false);
146
+ }
147
+ /**
148
+ * Run the Bearer gate: answers the SDK challenge (401/403 with `WWW-Authenticate`) and returns false,
149
+ * or sets `req.auth` and returns true. With no gate configured it lets the request through.
150
+ */
151
+ export async function runBearerGate(req, res, gate) {
152
+ if (!gate)
153
+ return true;
154
+ const outcome = await authenticate(req.headers.authorization, gate);
155
+ if (!outcome.ok) {
156
+ await writeWebResponse(res, outcome.response);
157
+ return false;
158
+ }
159
+ req.auth = outcome.authInfo;
160
+ return true;
161
+ }
162
+ /** The content-type check: the SDK's media-type essence comparison (`application/json`, params allowed). */
163
+ export function isJsonRequest(req) {
164
+ const header = req.headers['content-type'];
165
+ return typeof header === 'string' && isJsonContentType(header);
166
+ }
86
167
  /**
87
168
  * Build the `(req, res)` handler for the HTTP transport. Extracted from `startHttp` so the routing,
88
- * auth, content-type/size guards, and error handling are unit-testable with mock req/res — no socket
89
- * binding required.
169
+ * auth, content-type/size guards, and error handling are unit-testable with mock req/res, no socket
170
+ * binding required. Order: `/health`, Bearer check, path check, Host/Origin allow-lists, 415, 413,
171
+ * then the SDK handler.
90
172
  */
91
173
  export function createRequestHandler(cfg) {
92
- const { getServer, authEnabled, apiKey, maxBodyBytes, enableDnsRebindingProtection, allowedHosts, allowedOrigins, } = cfg;
93
- return async (req, res) => {
174
+ const { getServer, authEnabled, apiKey, maxBodyBytes, enableDnsRebindingProtection, allowedHosts, allowedOrigins } = cfg;
175
+ const mcpHandler = createMcpHandler(getServer, {
176
+ legacy: 'stateless',
177
+ onerror: reportError,
178
+ bus: cfg.bus ?? processBus(),
179
+ });
180
+ const nodeHandler = toNodeHandler(mcpHandler, { onerror: reportError });
181
+ const gate = authEnabled ? bearerOptions(cfg.auth, apiKey || undefined) : undefined;
182
+ if (authEnabled && !gate)
183
+ throw new Error('[mcp-core] HTTP auth is enabled but neither an API key nor a verifier is set');
184
+ const guards = [];
185
+ if (enableDnsRebindingProtection && allowedHosts.length > 0) {
186
+ guards.push(hostHeaderValidation(allowedHosts.map(toHostname)));
187
+ }
188
+ if (enableDnsRebindingProtection && allowedOrigins.length > 0) {
189
+ guards.push(originValidation(allowedOrigins.map(toOriginHostname)));
190
+ }
191
+ const handle = async (req, res) => {
94
192
  try {
95
- // Health probe — no auth required
193
+ // Health probe: no auth required
96
194
  if (req.method === 'GET' && req.url === '/health') {
97
- res.writeHead(200, { 'Content-Type': 'application/json' });
98
- res.end(JSON.stringify({ status: 'healthy' }));
195
+ sendJson(res, 200, { status: 'healthy' });
196
+ return;
197
+ }
198
+ // Bearer gate (the SDK's verifyBearerToken; constant-time key compare); sets req.auth.
199
+ if (!(await runBearerGate(req, res, gate)))
200
+ return;
201
+ if (!isMcpPath(req.url)) {
202
+ sendJson(res, 404, { error: 'Not found' });
99
203
  return;
100
204
  }
101
- // Bearer token auth (constant-time)
102
- if (authEnabled) {
103
- const auth = req.headers['authorization'] ?? '';
104
- if (!bearerMatches(auth, apiKey)) {
105
- res.writeHead(401, { 'Content-Type': 'application/json' });
106
- res.end(JSON.stringify({ error: 'Unauthorized' }));
205
+ // DNS-rebinding protection: each SDK guard answers 403 itself and returns false.
206
+ for (const guard of guards) {
207
+ if (!guard(req, res))
107
208
  return;
108
- }
109
209
  }
110
- // MCP endpoint — stateless: new server + transport per request
111
- if (req.url === '/mcp' || req.url?.startsWith('/mcp?')) {
112
- let body;
113
- if (req.method === 'POST') {
114
- // Require JSON content type (the body is parsed below).
115
- const contentType = (req.headers['content-type'] ?? '').toLowerCase();
116
- if (!contentType.includes('application/json')) {
117
- res.writeHead(415, { 'Content-Type': 'application/json' });
118
- res.end(JSON.stringify({ error: 'Unsupported Media Type: Content-Type must be application/json' }));
210
+ let body;
211
+ if (req.method === 'POST') {
212
+ if (!isJsonRequest(req)) {
213
+ sendJson(res, 415, { error: 'Unsupported Media Type: Content-Type must be application/json' });
214
+ return;
215
+ }
216
+ let raw;
217
+ try {
218
+ raw = await readBody(req, maxBodyBytes);
219
+ }
220
+ catch (e) {
221
+ if (e instanceof BodyTooLargeError) {
222
+ sendJson(res, 413, { error: 'Payload Too Large' }, { Connection: 'close' });
119
223
  return;
120
224
  }
121
- let raw;
122
- try {
123
- raw = await readBody(req, maxBodyBytes);
124
- }
125
- catch (e) {
126
- if (e instanceof BodyTooLargeError) {
127
- res.writeHead(413, { 'Content-Type': 'application/json' });
128
- res.end(JSON.stringify({ error: 'Payload Too Large' }));
129
- return;
130
- }
131
- throw e;
132
- }
133
- if (raw.trim()) {
134
- try {
135
- body = JSON.parse(raw);
136
- }
137
- catch { /* let transport surface the error */ }
138
- }
225
+ throw e;
226
+ }
227
+ try {
228
+ body = JSON.parse(raw);
229
+ }
230
+ catch {
231
+ sendJson(res, 400, {
232
+ jsonrpc: '2.0',
233
+ error: { code: -32700, message: 'Parse error: Invalid JSON' },
234
+ id: null,
235
+ });
236
+ return;
139
237
  }
140
- const server = getServer();
141
- const transport = new StreamableHTTPServerTransport({
142
- sessionIdGenerator: undefined, // stateless — no Mcp-Session-Id
143
- enableJsonResponse: true,
144
- ...(enableDnsRebindingProtection ? { enableDnsRebindingProtection: true, allowedHosts, allowedOrigins } : {}),
145
- });
146
- await server.connect(transport);
147
- await transport.handleRequest(req, res, body);
148
- return;
149
238
  }
150
- res.writeHead(404, { 'Content-Type': 'application/json' });
151
- res.end(JSON.stringify({ error: 'Not found' }));
239
+ await nodeHandler(req, res, body);
152
240
  }
153
241
  catch (err) {
154
- const msg = err instanceof Error ? err.message : String(err);
155
- process.stderr.write(`[mcp-core] request error: ${msg}\n`);
242
+ reportError(err);
156
243
  if (!res.headersSent) {
157
- res.writeHead(500, { 'Content-Type': 'application/json' });
158
- res.end(JSON.stringify({ error: 'Internal server error' }));
244
+ sendJson(res, 500, { error: 'Internal server error' });
159
245
  }
160
246
  }
161
247
  };
248
+ return Object.assign(handle, { close: () => mcpHandler.close() });
249
+ }
250
+ function onceAsync(fn) {
251
+ let pending;
252
+ return () => {
253
+ pending ??= fn();
254
+ return pending;
255
+ };
256
+ }
257
+ /** The transport mode from the option, else MCP_TRANSPORT, else stdio; anything else throws. */
258
+ export function resolveTransportMode(option, env = process.env) {
259
+ const mode = option ?? (env.MCP_TRANSPORT || 'stdio');
260
+ if (mode !== 'stdio' && mode !== 'http') {
261
+ throw new Error(`[mcp-core] MCP_TRANSPORT must be 'stdio' or 'http' (got '${mode}')`);
262
+ }
263
+ return mode;
162
264
  }
163
265
  /**
164
- * Start an MCP server with the configured transport.
266
+ * Start an MCP server with the configured transport. Resolves with a `TransportHandle` once serving:
165
267
  *
166
- * For stdio: connects once and keeps the process alive.
167
- * For http: starts a stateless HTTP server. GET /health is always available.
168
- * Pass a factory function to get a fresh server instance per request.
268
+ * For stdio: serves the process' stdin/stdout. An instance is accepted and wrapped as `() => instance`.
269
+ * With `handleSignals` (default) SIGINT/SIGTERM close the connection and re-raise the signal
270
+ * when no other listener remains. `closed` resolves when the client closes stdin.
271
+ * For http: starts a stateless HTTP server and resolves once the listener is bound (the process stays
272
+ * alive on the listener). With `handleSignals` (default) SIGINT/SIGTERM close it. Requires a
273
+ * factory (a fresh instance per request).
169
274
  */
170
275
  export async function startMcpServer(serverOrFactory, options = {}) {
171
- const mode = options.mode ?? process.env.MCP_TRANSPORT ?? 'stdio';
276
+ const mode = resolveTransportMode(options.mode);
277
+ const handleSignals = options.handleSignals !== false;
278
+ const bus = options.bus ?? processBus();
172
279
  if (mode === 'stdio') {
173
- const server = resolve(serverOrFactory);
174
- await server.connect(new StdioServerTransport());
175
- return;
280
+ return startStdio(typeof serverOrFactory === 'function' ? serverOrFactory : () => serverOrFactory, handleSignals, bus);
281
+ }
282
+ if (typeof serverOrFactory !== 'function') {
283
+ throw new Error(HTTP_FACTORY_REQUIRED);
284
+ }
285
+ return startHttp(serverOrFactory, { ...options, bus }, handleSignals);
286
+ }
287
+ /** A factory whose instances forward the bus's change events (a stdio connection is long-lived). */
288
+ export function notifyingFactory(factory, bus) {
289
+ return (ctx) => {
290
+ const server = factory(ctx);
291
+ attachNotifications(server, ctx.era, bus);
292
+ return server;
293
+ };
294
+ }
295
+ function startStdio(factory, handleSignals, bus) {
296
+ const stdio = serveStdio(notifyingFactory(factory, bus), { onerror: reportError });
297
+ let markClosed = () => undefined;
298
+ const closed = new Promise((resolve) => {
299
+ markClosed = resolve;
300
+ });
301
+ // The SDK's stdio transport closes itself when stdin ends; mirror that so the host can dispose and
302
+ // exit (keep-alive handles from `setup` would otherwise orphan the process).
303
+ const onStdinEnd = () => {
304
+ close().catch(reportError);
305
+ };
306
+ const onSignal = (signal) => {
307
+ process.off('SIGINT', onSignal);
308
+ process.off('SIGTERM', onSignal);
309
+ close()
310
+ .catch(reportError)
311
+ .finally(() => {
312
+ // Restore the default "signal terminates the process" unless the host app handles it itself.
313
+ if (process.listenerCount(signal) === 0)
314
+ process.kill(process.pid, signal);
315
+ });
316
+ };
317
+ const close = onceAsync(async () => {
318
+ process.off('SIGINT', onSignal);
319
+ process.off('SIGTERM', onSignal);
320
+ process.stdin.off('end', onStdinEnd);
321
+ process.stdin.off('close', onStdinEnd);
322
+ try {
323
+ await stdio.close();
324
+ }
325
+ finally {
326
+ markClosed();
327
+ }
328
+ });
329
+ process.stdin.once('end', onStdinEnd);
330
+ process.stdin.once('close', onStdinEnd);
331
+ if (handleSignals) {
332
+ process.on('SIGINT', onSignal);
333
+ process.on('SIGTERM', onSignal);
176
334
  }
177
- await startHttp(serverOrFactory, options);
335
+ return { mode: 'stdio', closed, bus, notify: createNotifier(bus), close };
178
336
  }
179
- async function startHttp(serverOrFactory, options) {
337
+ async function startHttp(factory, options, handleSignals) {
180
338
  const port = options.port ?? parseInt(process.env.PORT ?? '8080', 10);
181
- const host = process.env.MCP_HTTP_HOST || '0.0.0.0';
182
- const maxBodyBytes = Number(process.env.MCP_MAX_BODY_BYTES) || 4 * 1024 * 1024;
183
- // Auth resolution: FAIL CLOSED (throws when http + no key + not explicitly disabled).
339
+ const host = options.host || process.env.MCP_HTTP_HOST || '0.0.0.0';
340
+ const maxBodyBytes = options.maxBodyBytes ?? (Number(process.env.MCP_MAX_BODY_BYTES) || DEFAULT_MAX_BODY_BYTES);
341
+ // Auth resolution: FAIL CLOSED (throws when http + no key + no verifier + not explicitly disabled).
184
342
  const { authEnabled, apiKey } = resolveHttpAuth(options);
185
343
  if (!authEnabled) {
186
344
  process.stderr.write('[mcp-core] WARNING: HTTP transport running WITHOUT auth (MCP_AUTH_DISABLED). ' +
187
345
  'Ensure a gateway/platform fronts authentication.\n');
188
346
  }
189
- // --- DNS-rebinding / Host+Origin protection (opt-in via allowlist envs) --------------------------
190
- const allowedHosts = (process.env.MCP_ALLOWED_HOSTS || '').split(',').map(s => s.trim()).filter(Boolean);
191
- const allowedOrigins = (process.env.MCP_ALLOWED_ORIGINS || '').split(',').map(s => s.trim()).filter(Boolean);
347
+ // DNS-rebinding / Host+Origin protection (opt-in via allowlist envs)
348
+ const allowedHosts = options.allowedHosts ?? parseList(process.env.MCP_ALLOWED_HOSTS);
349
+ const allowedOrigins = options.allowedOrigins ?? parseList(process.env.MCP_ALLOWED_ORIGINS);
192
350
  const enableDnsRebindingProtection = allowedHosts.length > 0 || allowedOrigins.length > 0;
193
- // Wrap a plain instance so getServer() always returns a callable factory
194
- const getServer = typeof serverOrFactory === 'function' ? serverOrFactory : () => serverOrFactory;
195
- const httpServer = createServer(createRequestHandler({
196
- getServer, authEnabled, apiKey, maxBodyBytes,
197
- enableDnsRebindingProtection, allowedHosts, allowedOrigins,
198
- }));
351
+ const handler = createRequestHandler({
352
+ getServer: factory,
353
+ authEnabled,
354
+ apiKey,
355
+ ...(options.auth ? { auth: options.auth } : {}),
356
+ maxBodyBytes,
357
+ enableDnsRebindingProtection,
358
+ allowedHosts,
359
+ allowedOrigins,
360
+ ...(options.bus ? { bus: options.bus } : {}),
361
+ });
362
+ const httpServer = createServer(handler);
363
+ const bus = options.bus ?? processBus();
199
364
  await new Promise((ok, fail) => {
200
- httpServer.listen(port, host, ok);
201
365
  httpServer.once('error', fail);
366
+ httpServer.listen(port, host, ok);
202
367
  });
203
- process.stderr.write(`[mcp-core] HTTP server listening on http://${host}:${port}/mcp\n`);
204
- // Block until signal
205
- await new Promise(done => {
206
- const shutdown = () => {
368
+ const address = httpServer.address();
369
+ const boundPort = typeof address === 'object' && address ? address.port : port;
370
+ const url = `http://${host}:${boundPort}/mcp`;
371
+ process.stderr.write(`[mcp-core] HTTP server listening on ${url}\n`);
372
+ let markClosed = () => undefined;
373
+ const closed = new Promise((resolve) => {
374
+ markClosed = resolve;
375
+ });
376
+ // Close the SDK handler (aborts in-flight exchanges), then the listener.
377
+ const shutdown = () => {
378
+ close().catch(reportError);
379
+ };
380
+ const close = onceAsync(async () => {
381
+ process.off('SIGINT', shutdown);
382
+ process.off('SIGTERM', shutdown);
383
+ await handler.close().catch(reportError);
384
+ await new Promise((done) => {
207
385
  httpServer.close(() => done());
208
- };
209
- process.once('SIGTERM', shutdown);
210
- process.once('SIGINT', shutdown);
386
+ httpServer.closeAllConnections?.();
387
+ });
388
+ markClosed();
211
389
  });
390
+ if (handleSignals) {
391
+ process.on('SIGINT', shutdown);
392
+ process.on('SIGTERM', shutdown);
393
+ }
394
+ return { mode: 'http', host, port: boundPort, url, closed, bus, notify: createNotifier(bus), close };
212
395
  }
213
396
  //# sourceMappingURL=transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @novorb/mcp-core - Upstream URL path segments
3
+ *
4
+ * `encodeURIComponent` alone is not enough to put a caller value (an id, a name) into an upstream URL
5
+ * path: it leaves `.` and `..` intact and the URL parser collapses them (`/repositories/..` addresses
6
+ * the parent resource). `pathSegment` encodes one value as exactly one segment and refuses what would
7
+ * not stay one, as the most lenient upstream would read it: empty, `.`, `..`, their percent-encoded
8
+ * forms (also double-encoded, for upstreams that decode twice), overlong UTF-8 dots (`%c0%ae`), unicode
9
+ * dot forms after NFKC normalisation (fullwidth, small, one-dot leader, ideographic full stop), and C0 /
10
+ * C1 control characters, DEL, U+2028 and U+2029 (raw or encoded).
11
+ *
12
+ * The error (`InvalidPathSegmentError`) names the argument and never echoes the value; `registerTools`
13
+ * turns it into an actionable isError (`Invalid <name>: ...`) whatever the server's `mapError` does.
14
+ *
15
+ * const path = buildPath`/repositories/${{ name: 'repository', value: args.repository }}/components`;
16
+ * const same = joinPath('repositories', { name: 'repository', value: args.repository }, 'components');
17
+ */
18
+ /** What was wrong with a path segment. */
19
+ export type PathSegmentProblem = 'empty' | 'dot-segment' | 'control' | 'invalid';
20
+ /** A value that cannot be one upstream path segment. The message names the argument, never the value. */
21
+ export declare class InvalidPathSegmentError extends Error {
22
+ /** The argument name (`options.name`, default `path segment`). */
23
+ readonly argument: string;
24
+ readonly problem: PathSegmentProblem;
25
+ constructor(argument: string, problem: PathSegmentProblem);
26
+ }
27
+ export interface PathSegmentOptions {
28
+ /** The argument name used in the error (for example the tool argument `repository`). */
29
+ name?: string;
30
+ }
31
+ /** A value for `buildPath` / `joinPath`: a bare value, or one carrying its argument name for the error. */
32
+ export type PathValue = string | number | {
33
+ name: string;
34
+ value: string | number;
35
+ };
36
+ /**
37
+ * Encode `value` as exactly one URL path segment (`encodeURIComponent`), refusing empty, dot segments in
38
+ * every encoded, overlong and unicode form, and control characters. Throws `InvalidPathSegmentError`
39
+ * naming `options.name`.
40
+ */
41
+ export declare function pathSegment(value: string | number, options?: PathSegmentOptions): string;
42
+ /**
43
+ * Tagged template: the literal parts are kept as written, every interpolated value goes through
44
+ * `pathSegment` (pass `{ name, value }` to name the argument in the error).
45
+ */
46
+ export declare function buildPath(template: TemplateStringsArray, ...values: PathValue[]): string;
47
+ /** Join segments, each through `pathSegment`, with one leading slash (`/` for none). */
48
+ export declare function joinPath(...segments: PathValue[]): string;
49
+ //# sourceMappingURL=url-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-path.d.ts","sourceRoot":"","sources":["../src/url-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;AASjF,yGAAyG;AACzG,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;gBACzB,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB;CAM1D;AAED,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,2GAA2G;AAC3G,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAiFnF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAkB5F;AAOD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAMxF;AAED,wFAAwF;AACxF,wBAAgB,QAAQ,CAAC,GAAG,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAEzD"}