@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.
- package/README.md +82 -161
- package/bin/mcp-core-jest.mjs +112 -0
- package/dist/auth.d.ts +57 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +74 -0
- package/dist/auth.js.map +1 -0
- package/dist/bootstrap.d.ts +129 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +206 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/client-input.d.ts +72 -0
- package/dist/client-input.d.ts.map +1 -0
- package/dist/client-input.js +109 -0
- package/dist/client-input.js.map +1 -0
- package/dist/credential-checks.d.ts +80 -0
- package/dist/credential-checks.d.ts.map +1 -0
- package/dist/credential-checks.js +189 -0
- package/dist/credential-checks.js.map +1 -0
- package/dist/credential-health.d.ts +12 -0
- package/dist/credential-health.d.ts.map +1 -0
- package/dist/credential-health.js +12 -0
- package/dist/credential-health.js.map +1 -0
- package/dist/credential-report.d.ts +46 -0
- package/dist/credential-report.d.ts.map +1 -0
- package/dist/credential-report.js +135 -0
- package/dist/credential-report.js.map +1 -0
- package/dist/credential-status-tool.d.ts +20 -0
- package/dist/credential-status-tool.d.ts.map +1 -0
- package/dist/credential-status-tool.js +33 -0
- package/dist/credential-status-tool.js.map +1 -0
- package/dist/credentials.d.ts +288 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +652 -0
- package/dist/credentials.js.map +1 -0
- package/dist/express-peers.d.ts +29 -0
- package/dist/express-peers.d.ts.map +1 -0
- package/dist/express-peers.js +36 -0
- package/dist/express-peers.js.map +1 -0
- package/dist/express.d.ts +74 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +164 -0
- package/dist/express.js.map +1 -0
- package/dist/http-client.d.ts +278 -43
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +620 -182
- package/dist/http-client.js.map +1 -1
- package/dist/index.d.ts +27 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -10
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +28 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +37 -0
- package/dist/limits.js.map +1 -0
- package/dist/list-pagination.d.ts +41 -0
- package/dist/list-pagination.d.ts.map +1 -0
- package/dist/list-pagination.js +104 -0
- package/dist/list-pagination.js.map +1 -0
- package/dist/net.d.ts +112 -0
- package/dist/net.d.ts.map +1 -0
- package/dist/net.js +490 -0
- package/dist/net.js.map +1 -0
- package/dist/notifications.d.ts +78 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +173 -0
- package/dist/notifications.js.map +1 -0
- package/dist/pagination.d.ts +236 -5
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +393 -6
- package/dist/pagination.js.map +1 -1
- package/dist/prompts.d.ts +70 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +109 -0
- package/dist/prompts.js.map +1 -0
- package/dist/protocol-errors.d.ts +15 -0
- package/dist/protocol-errors.d.ts.map +1 -0
- package/dist/protocol-errors.js +28 -0
- package/dist/protocol-errors.js.map +1 -0
- package/dist/protocol-logging.d.ts +37 -0
- package/dist/protocol-logging.d.ts.map +1 -0
- package/dist/protocol-logging.js +77 -0
- package/dist/protocol-logging.js.map +1 -0
- package/dist/rate-limiter.d.ts +36 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +79 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/request-state.d.ts +74 -0
- package/dist/request-state.d.ts.map +1 -0
- package/dist/request-state.js +190 -0
- package/dist/request-state.js.map +1 -0
- package/dist/resources.d.ts +181 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +302 -0
- package/dist/resources.js.map +1 -0
- package/dist/result-limits.d.ts +80 -0
- package/dist/result-limits.d.ts.map +1 -0
- package/dist/result-limits.js +248 -0
- package/dist/result-limits.js.map +1 -0
- package/dist/retry.d.ts +79 -23
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +170 -57
- package/dist/retry.js.map +1 -1
- package/dist/sdk/client-stdio.d.ts +6 -0
- package/dist/sdk/client-stdio.d.ts.map +1 -0
- package/dist/sdk/client-stdio.js +6 -0
- package/dist/sdk/client-stdio.js.map +1 -0
- package/dist/sdk/client.d.ts +6 -0
- package/dist/sdk/client.d.ts.map +1 -0
- package/dist/sdk/client.js +6 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/express.d.ts +3 -0
- package/dist/sdk/express.d.ts.map +1 -0
- package/dist/sdk/express.js +11 -0
- package/dist/sdk/express.js.map +1 -0
- package/dist/sdk/node.d.ts +6 -0
- package/dist/sdk/node.d.ts.map +1 -0
- package/dist/sdk/node.js +6 -0
- package/dist/sdk/node.js.map +1 -0
- package/dist/sdk/server-stdio.d.ts +6 -0
- package/dist/sdk/server-stdio.d.ts.map +1 -0
- package/dist/sdk/server-stdio.js +6 -0
- package/dist/sdk/server-stdio.js.map +1 -0
- package/dist/sdk/server.d.ts +6 -0
- package/dist/sdk/server.d.ts.map +1 -0
- package/dist/sdk/server.js +6 -0
- package/dist/sdk/server.js.map +1 -0
- package/dist/server.d.ts +88 -36
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +98 -44
- package/dist/server.js.map +1 -1
- package/dist/task-request.d.ts +20 -0
- package/dist/task-request.d.ts.map +1 -0
- package/dist/task-request.js +43 -0
- package/dist/task-request.js.map +1 -0
- package/dist/task-store.d.ts +230 -0
- package/dist/task-store.d.ts.map +1 -0
- package/dist/task-store.js +459 -0
- package/dist/task-store.js.map +1 -0
- package/dist/task-tools.d.ts +115 -0
- package/dist/task-tools.d.ts.map +1 -0
- package/dist/task-tools.js +397 -0
- package/dist/task-tools.js.map +1 -0
- package/dist/testing/client.d.ts +25 -0
- package/dist/testing/client.d.ts.map +1 -0
- package/dist/testing/client.js +11 -0
- package/dist/testing/client.js.map +1 -0
- package/dist/testing/in-memory.d.ts +26 -0
- package/dist/testing/in-memory.d.ts.map +1 -0
- package/dist/testing/in-memory.js +41 -0
- package/dist/testing/in-memory.js.map +1 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +20 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/isolated-dirs.d.ts +27 -0
- package/dist/testing/isolated-dirs.d.ts.map +1 -0
- package/dist/testing/isolated-dirs.js +67 -0
- package/dist/testing/isolated-dirs.js.map +1 -0
- package/dist/testing/logs.d.ts +61 -0
- package/dist/testing/logs.d.ts.map +1 -0
- package/dist/testing/logs.js +113 -0
- package/dist/testing/logs.js.map +1 -0
- package/dist/testing/raw-http.d.ts +25 -0
- package/dist/testing/raw-http.d.ts.map +1 -0
- package/dist/testing/raw-http.js +41 -0
- package/dist/testing/raw-http.js.map +1 -0
- package/dist/testing/raw-peer.d.ts +43 -0
- package/dist/testing/raw-peer.d.ts.map +1 -0
- package/dist/testing/raw-peer.js +101 -0
- package/dist/testing/raw-peer.js.map +1 -0
- package/dist/testing/recording-server.d.ts +38 -0
- package/dist/testing/recording-server.d.ts.map +1 -0
- package/dist/testing/recording-server.js +38 -0
- package/dist/testing/recording-server.js.map +1 -0
- package/dist/testing/server-process.d.ts +76 -0
- package/dist/testing/server-process.d.ts.map +1 -0
- package/dist/testing/server-process.js +241 -0
- package/dist/testing/server-process.js.map +1 -0
- package/dist/testing/tools.d.ts +53 -0
- package/dist/testing/tools.d.ts.map +1 -0
- package/dist/testing/tools.js +98 -0
- package/dist/testing/tools.js.map +1 -0
- package/dist/testing/unit.d.ts +52 -0
- package/dist/testing/unit.d.ts.map +1 -0
- package/dist/testing/unit.js +95 -0
- package/dist/testing/unit.js.map +1 -0
- package/dist/tools.d.ts +205 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +370 -0
- package/dist/tools.js.map +1 -0
- package/dist/transport.d.ts +144 -53
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +305 -122
- package/dist/transport.js.map +1 -1
- package/dist/url-path.d.ts +49 -0
- package/dist/url-path.d.ts.map +1 -0
- package/dist/url-path.js +165 -0
- package/dist/url-path.js.map +1 -0
- package/dist/utils/dataStore.d.ts +143 -0
- package/dist/utils/dataStore.d.ts.map +1 -0
- package/dist/utils/dataStore.js +429 -0
- package/dist/utils/dataStore.js.map +1 -0
- package/dist/utils/envLoader.d.ts +129 -0
- package/dist/utils/envLoader.d.ts.map +1 -0
- package/dist/utils/envLoader.js +399 -0
- package/dist/utils/envLoader.js.map +1 -0
- package/dist/utils/logger.d.ts +181 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +664 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/redact.d.ts +50 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +318 -0
- package/dist/utils/redact.js.map +1 -0
- package/docs/api-reference.md +29 -0
- package/docs/building-a-server.md +63 -0
- package/docs/credentials.md +131 -0
- package/docs/data-store.md +37 -0
- package/docs/env.md +38 -0
- package/docs/features.md +28 -0
- package/docs/http-client.md +116 -0
- package/docs/logger.md +100 -0
- package/docs/migrating-to-v3.md +45 -0
- package/docs/outbound-urls.md +104 -0
- package/docs/pagination.md +45 -0
- package/docs/protocol-features.md +62 -0
- package/docs/resources-prompts-tasks.md +95 -0
- package/docs/sdk.md +33 -0
- package/docs/server.md +68 -0
- package/docs/testing-harness.md +139 -0
- package/docs/testing.md +151 -0
- package/docs/tools.md +88 -0
- package/docs/transport.md +85 -0
- package/examples/testing/tools.integration.test.example.ts +312 -0
- package/examples/testing/tools.unit.test.example.ts +149 -0
- package/package.json +140 -18
- package/dist/logger.d.ts +0 -80
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -236
- package/dist/logger.js.map +0 -1
package/dist/transport.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;
|
|
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
|
|
2
|
+
* @novorb/mcp-core - Transport
|
|
3
3
|
*
|
|
4
|
-
* Unified transport for MCP servers. Selects between stdio and
|
|
5
|
-
*
|
|
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
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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
|
-
|
|
36
|
-
|
|
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() {
|
|
48
|
+
constructor() {
|
|
49
|
+
super('Request body too large');
|
|
50
|
+
this.name = 'BodyTooLargeError';
|
|
51
|
+
}
|
|
41
52
|
}
|
|
42
|
-
/**
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
93
|
-
|
|
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
|
|
193
|
+
// Health probe: no auth required
|
|
96
194
|
if (req.method === 'GET' && req.url === '/health') {
|
|
97
|
-
res
|
|
98
|
-
|
|
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
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
111
|
-
if (req.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
151
|
-
res.end(JSON.stringify({ error: 'Not found' }));
|
|
239
|
+
await nodeHandler(req, res, body);
|
|
152
240
|
}
|
|
153
241
|
catch (err) {
|
|
154
|
-
|
|
155
|
-
process.stderr.write(`[mcp-core] request error: ${msg}\n`);
|
|
242
|
+
reportError(err);
|
|
156
243
|
if (!res.headersSent) {
|
|
157
|
-
res
|
|
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:
|
|
167
|
-
*
|
|
168
|
-
*
|
|
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
|
|
276
|
+
const mode = resolveTransportMode(options.mode);
|
|
277
|
+
const handleSignals = options.handleSignals !== false;
|
|
278
|
+
const bus = options.bus ?? processBus();
|
|
172
279
|
if (mode === 'stdio') {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
335
|
+
return { mode: 'stdio', closed, bus, notify: createNotifier(bus), close };
|
|
178
336
|
}
|
|
179
|
-
async function startHttp(
|
|
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) ||
|
|
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
|
-
//
|
|
190
|
-
const allowedHosts = (process.env.MCP_ALLOWED_HOSTS
|
|
191
|
-
const allowedOrigins = (process.env.MCP_ALLOWED_ORIGINS
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
210
|
-
|
|
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
|
package/dist/transport.js.map
CHANGED
|
@@ -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"}
|