@j0hanz/fetch-url-mcp 1.2.0 → 1.3.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 (184) hide show
  1. package/dist/cache.d.ts +9 -3
  2. package/dist/cache.d.ts.map +1 -0
  3. package/dist/cache.js +54 -119
  4. package/dist/cache.js.map +1 -0
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +7 -4
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config.d.ts +2 -3
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +19 -27
  12. package/dist/config.js.map +1 -0
  13. package/dist/crypto.d.ts +1 -0
  14. package/dist/crypto.d.ts.map +1 -0
  15. package/dist/crypto.js +7 -3
  16. package/dist/crypto.js.map +1 -0
  17. package/dist/dom-noise-removal.d.ts +2 -1
  18. package/dist/dom-noise-removal.d.ts.map +1 -0
  19. package/dist/dom-noise-removal.js +9 -6
  20. package/dist/dom-noise-removal.js.map +1 -0
  21. package/dist/download.d.ts +4 -0
  22. package/dist/download.d.ts.map +1 -0
  23. package/dist/download.js +106 -0
  24. package/dist/download.js.map +1 -0
  25. package/dist/errors.d.ts +1 -0
  26. package/dist/errors.d.ts.map +1 -0
  27. package/dist/errors.js +2 -1
  28. package/dist/errors.js.map +1 -0
  29. package/dist/examples/mcp-fetch-url-client.js +19 -3
  30. package/dist/examples/mcp-fetch-url-client.js.map +1 -1
  31. package/dist/fetch-content.d.ts +1 -0
  32. package/dist/fetch-content.d.ts.map +1 -0
  33. package/dist/fetch-content.js +15 -14
  34. package/dist/fetch-content.js.map +1 -0
  35. package/dist/fetch-stream.d.ts +1 -0
  36. package/dist/fetch-stream.d.ts.map +1 -0
  37. package/dist/fetch-stream.js +1 -0
  38. package/dist/fetch-stream.js.map +1 -0
  39. package/dist/fetch.d.ts +1 -0
  40. package/dist/fetch.d.ts.map +1 -0
  41. package/dist/fetch.js +123 -54
  42. package/dist/fetch.js.map +1 -0
  43. package/dist/host-normalization.d.ts +1 -0
  44. package/dist/host-normalization.d.ts.map +1 -0
  45. package/dist/host-normalization.js +22 -9
  46. package/dist/host-normalization.js.map +1 -0
  47. package/dist/http/auth.d.ts +51 -0
  48. package/dist/http/auth.d.ts.map +1 -0
  49. package/dist/http/auth.js +344 -0
  50. package/dist/http/auth.js.map +1 -0
  51. package/dist/http/health.d.ts +7 -0
  52. package/dist/http/health.d.ts.map +1 -0
  53. package/dist/http/health.js +156 -0
  54. package/dist/http/health.js.map +1 -0
  55. package/dist/http/helpers.d.ts +58 -0
  56. package/dist/http/helpers.d.ts.map +1 -0
  57. package/dist/http/helpers.js +370 -0
  58. package/dist/http/helpers.js.map +1 -0
  59. package/dist/{http-native.d.ts → http/native.d.ts} +1 -0
  60. package/dist/http/native.d.ts.map +1 -0
  61. package/dist/http/native.js +618 -0
  62. package/dist/http/native.js.map +1 -0
  63. package/dist/http/rate-limit.d.ts +13 -0
  64. package/dist/http/rate-limit.d.ts.map +1 -0
  65. package/dist/http/rate-limit.js +92 -0
  66. package/dist/http/rate-limit.js.map +1 -0
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +20 -14
  70. package/dist/index.js.map +1 -0
  71. package/dist/instructions.d.ts +2 -0
  72. package/dist/instructions.d.ts.map +1 -0
  73. package/dist/instructions.js +41 -0
  74. package/dist/instructions.js.map +1 -0
  75. package/dist/ip-blocklist.d.ts +1 -0
  76. package/dist/ip-blocklist.d.ts.map +1 -0
  77. package/dist/ip-blocklist.js +13 -8
  78. package/dist/ip-blocklist.js.map +1 -0
  79. package/dist/json.d.ts +2 -1
  80. package/dist/json.d.ts.map +1 -0
  81. package/dist/json.js +16 -6
  82. package/dist/json.js.map +1 -0
  83. package/dist/language-detection.d.ts +1 -0
  84. package/dist/language-detection.d.ts.map +1 -0
  85. package/dist/language-detection.js +2 -7
  86. package/dist/language-detection.js.map +1 -0
  87. package/dist/markdown-cleanup.d.ts +2 -1
  88. package/dist/markdown-cleanup.d.ts.map +1 -0
  89. package/dist/markdown-cleanup.js +52 -54
  90. package/dist/markdown-cleanup.js.map +1 -0
  91. package/dist/mcp-validator.d.ts +1 -0
  92. package/dist/mcp-validator.d.ts.map +1 -0
  93. package/dist/mcp-validator.js +20 -18
  94. package/dist/mcp-validator.js.map +1 -0
  95. package/dist/mcp.d.ts +2 -2
  96. package/dist/mcp.d.ts.map +1 -0
  97. package/dist/mcp.js +35 -344
  98. package/dist/mcp.js.map +1 -0
  99. package/dist/observability.d.ts +2 -0
  100. package/dist/observability.d.ts.map +1 -0
  101. package/dist/observability.js +32 -6
  102. package/dist/observability.js.map +1 -0
  103. package/dist/prompts.d.ts +1 -0
  104. package/dist/prompts.d.ts.map +1 -0
  105. package/dist/prompts.js +15 -3
  106. package/dist/prompts.js.map +1 -0
  107. package/dist/resources.d.ts +1 -0
  108. package/dist/resources.d.ts.map +1 -0
  109. package/dist/resources.js +46 -25
  110. package/dist/resources.js.map +1 -0
  111. package/dist/server-tuning.d.ts +1 -0
  112. package/dist/server-tuning.d.ts.map +1 -0
  113. package/dist/server-tuning.js +14 -17
  114. package/dist/server-tuning.js.map +1 -0
  115. package/dist/server.d.ts +1 -0
  116. package/dist/server.d.ts.map +1 -0
  117. package/dist/server.js +29 -35
  118. package/dist/server.js.map +1 -0
  119. package/dist/session.d.ts +2 -0
  120. package/dist/session.d.ts.map +1 -0
  121. package/dist/session.js +58 -29
  122. package/dist/session.js.map +1 -0
  123. package/dist/tasks/execution.d.ts +42 -0
  124. package/dist/tasks/execution.d.ts.map +1 -0
  125. package/dist/tasks/execution.js +241 -0
  126. package/dist/tasks/execution.js.map +1 -0
  127. package/dist/{tasks.d.ts → tasks/manager.d.ts} +12 -0
  128. package/dist/tasks/manager.d.ts.map +1 -0
  129. package/dist/{tasks.js → tasks/manager.js} +95 -43
  130. package/dist/tasks/manager.js.map +1 -0
  131. package/dist/tasks/owner.d.ts +32 -0
  132. package/dist/tasks/owner.d.ts.map +1 -0
  133. package/dist/tasks/owner.js +92 -0
  134. package/dist/tasks/owner.js.map +1 -0
  135. package/dist/timer-utils.d.ts +1 -0
  136. package/dist/timer-utils.d.ts.map +1 -0
  137. package/dist/timer-utils.js +8 -4
  138. package/dist/timer-utils.js.map +1 -0
  139. package/dist/tool-errors.d.ts +12 -0
  140. package/dist/tool-errors.d.ts.map +1 -0
  141. package/dist/tool-errors.js +55 -0
  142. package/dist/tool-errors.js.map +1 -0
  143. package/dist/tool-pipeline.d.ts +72 -0
  144. package/dist/tool-pipeline.d.ts.map +1 -0
  145. package/dist/tool-pipeline.js +408 -0
  146. package/dist/tool-pipeline.js.map +1 -0
  147. package/dist/tool-progress.d.ts +32 -0
  148. package/dist/tool-progress.d.ts.map +1 -0
  149. package/dist/tool-progress.js +129 -0
  150. package/dist/tool-progress.js.map +1 -0
  151. package/dist/tools.d.ts +35 -111
  152. package/dist/tools.d.ts.map +1 -0
  153. package/dist/tools.js +150 -610
  154. package/dist/tools.js.map +1 -0
  155. package/dist/{transform.d.ts → transform/transform.d.ts} +2 -1
  156. package/dist/transform/transform.d.ts.map +1 -0
  157. package/dist/{transform.js → transform/transform.js} +81 -771
  158. package/dist/transform/transform.js.map +1 -0
  159. package/dist/{transform-types.d.ts → transform/types.d.ts} +2 -0
  160. package/dist/transform/types.d.ts.map +1 -0
  161. package/dist/{transform-types.js → transform/types.js} +1 -0
  162. package/dist/transform/types.js.map +1 -0
  163. package/dist/transform/worker-pool.d.ts +93 -0
  164. package/dist/transform/worker-pool.d.ts.map +1 -0
  165. package/dist/transform/worker-pool.js +757 -0
  166. package/dist/transform/worker-pool.js.map +1 -0
  167. package/dist/transform/workers/transform-child.d.ts +2 -0
  168. package/dist/transform/workers/transform-child.d.ts.map +1 -0
  169. package/dist/{workers → transform/workers}/transform-child.js +17 -13
  170. package/dist/transform/workers/transform-child.js.map +1 -0
  171. package/dist/transform/workers/transform-worker.d.ts +2 -0
  172. package/dist/transform/workers/transform-worker.d.ts.map +1 -0
  173. package/dist/{workers → transform/workers}/transform-worker.js +16 -13
  174. package/dist/transform/workers/transform-worker.js.map +1 -0
  175. package/dist/type-guards.d.ts +1 -0
  176. package/dist/type-guards.d.ts.map +1 -0
  177. package/dist/type-guards.js +4 -4
  178. package/dist/type-guards.js.map +1 -0
  179. package/package.json +6 -7
  180. package/dist/AGENTS.md +0 -152
  181. package/dist/http-native.js +0 -1320
  182. package/dist/instructions.md +0 -113
  183. package/dist/workers/transform-child.d.ts +0 -1
  184. package/dist/workers/transform-worker.d.ts +0 -1
@@ -0,0 +1,618 @@
1
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
2
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { readFileSync } from 'node:fs';
5
+ import { createServer, } from 'node:http';
6
+ import { createServer as createHttpsServer, } from 'node:https';
7
+ import { hostname } from 'node:os';
8
+ import process from 'node:process';
9
+ import { config, enableHttpMode } from '../config.js';
10
+ import { handleDownload } from '../download.js';
11
+ import { acceptsEventStream, acceptsJsonAndEventStream, isJsonRpcBatchRequest, isMcpRequestBody, } from '../mcp-validator.js';
12
+ import { cancelTasksForOwner } from '../mcp.js';
13
+ import { logError, logInfo, registerMcpSessionServer, resolveMcpSessionIdByServer, runWithRequestContext, unregisterMcpSessionServer, unregisterMcpSessionServerByServer, } from '../observability.js';
14
+ import { applyHttpServerTuning, drainConnectionsOnShutdown, } from '../server-tuning.js';
15
+ import { createMcpServerForHttpSession } from '../server.js';
16
+ import { composeCloseHandlers, createSessionStore, createSlotTracker, ensureSessionCapacity, reserveSessionSlot, startSessionCleanupLoop, } from '../session.js';
17
+ import { isObject } from '../type-guards.js';
18
+ import { applyUnauthorizedAuthHeaders, assertHttpModeConfiguration, authService, buildAuthFingerprint, buildProtectedResourceMetadataDocument, corsPolicy, ensureMcpProtocolVersion, hostOriginPolicy, isProtectedResourceMetadataPath, SUPPORTED_MCP_PROTOCOL_VERSIONS, } from './auth.js';
19
+ import { disableEventLoopMonitoring, resetEventLoopMonitoring, sendHealthRouteResponse, shouldHandleHealthRoute, } from './health.js';
20
+ import { buildRequestContext, closeMcpServerBestEffort, closeTransportBestEffort, createRequestAbortSignal, createTransportAdapter, DEFAULT_BODY_LIMIT_BYTES, drainRequest, findDuplicateSingleValueHeader, getHeaderValue, getMcpSessionId, jsonBodyReader, registerInboundBlockList, sendError, sendJson, sendText, } from './helpers.js';
21
+ import { createRateLimitManagerImpl, } from './rate-limit.js';
22
+ // ---------------------------------------------------------------------------
23
+ // MCP session gateway
24
+ // ---------------------------------------------------------------------------
25
+ const DEFAULT_MCP_PROTOCOL_VERSION = '2025-11-25';
26
+ function resolveRequestedProtocolVersion(body) {
27
+ if (!isObject(body))
28
+ return DEFAULT_MCP_PROTOCOL_VERSION;
29
+ const { params } = body;
30
+ if (!isObject(params))
31
+ return DEFAULT_MCP_PROTOCOL_VERSION;
32
+ const { protocolVersion: value } = params;
33
+ if (typeof value !== 'string')
34
+ return DEFAULT_MCP_PROTOCOL_VERSION;
35
+ const normalized = value.trim();
36
+ if (normalized.length === 0)
37
+ return DEFAULT_MCP_PROTOCOL_VERSION;
38
+ if (!SUPPORTED_MCP_PROTOCOL_VERSIONS.has(normalized)) {
39
+ return DEFAULT_MCP_PROTOCOL_VERSION;
40
+ }
41
+ return normalized;
42
+ }
43
+ function isInitializedNotification(method) {
44
+ return method === 'notifications/initialized';
45
+ }
46
+ function isPingRequest(method) {
47
+ return method === 'ping';
48
+ }
49
+ class McpSessionGateway {
50
+ store;
51
+ createSessionServer;
52
+ constructor(store, createSessionServer) {
53
+ this.store = store;
54
+ this.createSessionServer = createSessionServer;
55
+ }
56
+ async handlePost(ctx) {
57
+ if (!acceptsJsonAndEventStream(getHeaderValue(ctx.req, 'accept'))) {
58
+ sendJson(ctx.res, 400, {
59
+ error: 'Accept header must include application/json and text/event-stream',
60
+ });
61
+ return;
62
+ }
63
+ const { body } = ctx;
64
+ if (isJsonRpcBatchRequest(body)) {
65
+ sendError(ctx.res, -32600, 'Batch requests not supported');
66
+ return;
67
+ }
68
+ if (!isMcpRequestBody(body)) {
69
+ sendError(ctx.res, -32600, 'Invalid request body');
70
+ return;
71
+ }
72
+ const requestId = body.id ?? null;
73
+ const isInitNotification = isInitializedNotification(body.method);
74
+ const sessionId = getMcpSessionId(ctx.req);
75
+ let session = sessionId ? this.store.get(sessionId) : undefined;
76
+ if (sessionId && !session) {
77
+ sendError(ctx.res, -32600, 'Session not found', 404, requestId);
78
+ return;
79
+ }
80
+ if (session) {
81
+ if (!ensureMcpProtocolVersion(ctx.req, ctx.res, {
82
+ requireHeader: true,
83
+ expectedVersion: session.negotiatedProtocolVersion,
84
+ })) {
85
+ return;
86
+ }
87
+ if (!session.protocolInitialized) {
88
+ const isPing = isPingRequest(body.method);
89
+ if (!isInitNotification && !isPing) {
90
+ sendError(ctx.res, -32600, 'Session not initialized', 400, requestId);
91
+ return;
92
+ }
93
+ }
94
+ if (isInitNotification && !session.protocolInitialized) {
95
+ session.protocolInitialized = true;
96
+ if (sessionId)
97
+ this.store.touch(sessionId);
98
+ }
99
+ }
100
+ else {
101
+ if (!ensureMcpProtocolVersion(ctx.req, ctx.res))
102
+ return;
103
+ }
104
+ if (isInitNotification && body.id === undefined) {
105
+ sendText(ctx.res, 200, '');
106
+ return;
107
+ }
108
+ logInfo('[MCP POST]', {
109
+ method: body.method,
110
+ id: body.id,
111
+ sessionId,
112
+ });
113
+ const transport = await this.getOrCreateTransport(ctx, requestId);
114
+ if (!transport)
115
+ return;
116
+ await transport.handleRequest(ctx.req, ctx.res, body);
117
+ if (sessionId && isInitNotification) {
118
+ session = this.store.get(sessionId);
119
+ if (session) {
120
+ session.protocolInitialized = true;
121
+ this.store.touch(sessionId);
122
+ }
123
+ }
124
+ }
125
+ async handleGet(ctx) {
126
+ const sessionId = getMcpSessionId(ctx.req);
127
+ if (!sessionId) {
128
+ sendError(ctx.res, -32600, 'Missing session ID');
129
+ return;
130
+ }
131
+ const session = this.store.get(sessionId);
132
+ if (!session) {
133
+ sendError(ctx.res, -32600, 'Session not found', 404);
134
+ return;
135
+ }
136
+ if (!ensureMcpProtocolVersion(ctx.req, ctx.res, {
137
+ requireHeader: true,
138
+ expectedVersion: session.negotiatedProtocolVersion,
139
+ })) {
140
+ return;
141
+ }
142
+ const acceptHeader = getHeaderValue(ctx.req, 'accept');
143
+ if (!acceptsEventStream(acceptHeader)) {
144
+ sendJson(ctx.res, 405, { error: 'Method Not Allowed' });
145
+ return;
146
+ }
147
+ this.store.touch(sessionId);
148
+ await session.transport.handleRequest(ctx.req, ctx.res);
149
+ }
150
+ async handleDelete(ctx) {
151
+ const sessionId = getMcpSessionId(ctx.req);
152
+ if (!sessionId) {
153
+ sendError(ctx.res, -32600, 'Missing session ID');
154
+ return;
155
+ }
156
+ const session = this.store.get(sessionId);
157
+ if (!session) {
158
+ sendError(ctx.res, -32600, 'Session not found', 404);
159
+ return;
160
+ }
161
+ if (!ensureMcpProtocolVersion(ctx.req, ctx.res, {
162
+ requireHeader: true,
163
+ expectedVersion: session.negotiatedProtocolVersion,
164
+ })) {
165
+ return;
166
+ }
167
+ await session.transport.close();
168
+ this.cleanupSessionRecord(sessionId, 'session-delete');
169
+ sendText(ctx.res, 200, 'Session closed');
170
+ }
171
+ async getOrCreateTransport(ctx, requestId) {
172
+ const sessionId = getMcpSessionId(ctx.req);
173
+ if (sessionId) {
174
+ const fingerprint = buildAuthFingerprint(ctx.auth);
175
+ return this.getExistingTransport(sessionId, fingerprint, ctx.res, requestId);
176
+ }
177
+ if (!isInitializeRequest(ctx.body)) {
178
+ sendError(ctx.res, -32600, 'Missing session ID', 400, requestId);
179
+ return null;
180
+ }
181
+ const negotiatedProtocolVersion = resolveRequestedProtocolVersion(ctx.body);
182
+ return this.createNewSession(ctx, requestId, negotiatedProtocolVersion);
183
+ }
184
+ getExistingTransport(sessionId, authFingerprint, res, requestId) {
185
+ const session = this.store.get(sessionId);
186
+ if (!session) {
187
+ sendError(res, -32600, 'Session not found', 404, requestId);
188
+ return null;
189
+ }
190
+ if (!authFingerprint || session.authFingerprint !== authFingerprint) {
191
+ sendError(res, -32600, 'Session not found', 404, requestId);
192
+ return null;
193
+ }
194
+ this.store.touch(sessionId);
195
+ return session.transport;
196
+ }
197
+ async createNewSession(ctx, requestId, negotiatedProtocolVersion) {
198
+ const authFingerprint = buildAuthFingerprint(ctx.auth);
199
+ if (!authFingerprint) {
200
+ sendError(ctx.res, -32603, 'Missing auth context', 500, requestId);
201
+ return null;
202
+ }
203
+ if (!this.reserveCapacity(ctx.res, requestId))
204
+ return null;
205
+ const tracker = createSlotTracker(this.store);
206
+ const newSessionId = randomUUID();
207
+ let sessionServer;
208
+ try {
209
+ sessionServer = await this.createSessionServer();
210
+ }
211
+ catch (error) {
212
+ tracker.releaseSlot();
213
+ throw error;
214
+ }
215
+ const transportImpl = new StreamableHTTPServerTransport({
216
+ sessionIdGenerator: () => newSessionId,
217
+ });
218
+ const initTimeout = setTimeout(() => {
219
+ if (!tracker.isInitialized()) {
220
+ tracker.releaseSlot();
221
+ void closeTransportBestEffort(transportImpl, 'session-init-timeout');
222
+ void closeMcpServerBestEffort(sessionServer, 'session-init-timeout');
223
+ }
224
+ }, config.server.sessionInitTimeoutMs);
225
+ initTimeout.unref();
226
+ transportImpl.onclose = () => {
227
+ clearTimeout(initTimeout);
228
+ if (!tracker.isInitialized())
229
+ tracker.releaseSlot();
230
+ };
231
+ try {
232
+ const transport = createTransportAdapter(transportImpl);
233
+ await sessionServer.connect(transport);
234
+ }
235
+ catch (err) {
236
+ clearTimeout(initTimeout);
237
+ tracker.releaseSlot();
238
+ void closeTransportBestEffort(transportImpl, 'session-connect-failed');
239
+ void closeMcpServerBestEffort(sessionServer, 'session-connect-failed');
240
+ throw err;
241
+ }
242
+ tracker.markInitialized();
243
+ tracker.releaseSlot();
244
+ this.store.set(newSessionId, {
245
+ server: sessionServer,
246
+ transport: transportImpl,
247
+ createdAt: Date.now(),
248
+ lastSeen: Date.now(),
249
+ protocolInitialized: false,
250
+ negotiatedProtocolVersion,
251
+ authFingerprint,
252
+ });
253
+ registerMcpSessionServer(newSessionId, sessionServer);
254
+ transportImpl.onclose = composeCloseHandlers(transportImpl.onclose, () => {
255
+ this.cleanupSessionRecord(newSessionId, 'session-close');
256
+ });
257
+ return transportImpl;
258
+ }
259
+ cleanupSessionRecord(sessionId, context) {
260
+ const session = this.store.remove(sessionId);
261
+ if (!session)
262
+ return;
263
+ cancelTasksForOwner(`session:${sessionId}`, 'The task was cancelled because the MCP session ended.');
264
+ unregisterMcpSessionServer(sessionId);
265
+ void closeMcpServerBestEffort(session.server, `${context}-server`);
266
+ }
267
+ reserveCapacity(res, requestId) {
268
+ const allowed = ensureSessionCapacity({
269
+ store: this.store,
270
+ maxSessions: config.server.maxSessions,
271
+ evictOldest: (store) => {
272
+ const evicted = store.evictOldest();
273
+ if (evicted) {
274
+ const sessionId = resolveMcpSessionIdByServer(evicted.server);
275
+ if (sessionId) {
276
+ cancelTasksForOwner(`session:${sessionId}`, 'The task was cancelled because the MCP session was evicted.');
277
+ unregisterMcpSessionServer(sessionId);
278
+ }
279
+ unregisterMcpSessionServerByServer(evicted.server);
280
+ void closeTransportBestEffort(evicted.transport, 'session-eviction');
281
+ void closeMcpServerBestEffort(evicted.server, 'session-eviction');
282
+ return true;
283
+ }
284
+ return false;
285
+ },
286
+ });
287
+ if (!allowed) {
288
+ sendError(res, -32000, 'Server busy', 503, requestId);
289
+ return false;
290
+ }
291
+ if (!reserveSessionSlot(this.store, config.server.maxSessions)) {
292
+ sendError(res, -32000, 'Server busy', 503, requestId);
293
+ return false;
294
+ }
295
+ return true;
296
+ }
297
+ }
298
+ // ---------------------------------------------------------------------------
299
+ // Download route
300
+ // ---------------------------------------------------------------------------
301
+ function checkDownloadRoute(path) {
302
+ const downloadMatch = /^\/mcp\/downloads\/([^/]+)\/([^/]+)$/.exec(path);
303
+ if (!downloadMatch)
304
+ return null;
305
+ const namespace = downloadMatch[1];
306
+ const hash = downloadMatch[2];
307
+ if (!namespace || !hash)
308
+ return null;
309
+ return { namespace, hash };
310
+ }
311
+ // ---------------------------------------------------------------------------
312
+ // HTTP dispatcher
313
+ // ---------------------------------------------------------------------------
314
+ class HttpDispatcher {
315
+ store;
316
+ mcpGateway;
317
+ constructor(store, mcpGateway) {
318
+ this.store = store;
319
+ this.mcpGateway = mcpGateway;
320
+ }
321
+ async tryHandleHealthRoute(ctx) {
322
+ if (!shouldHandleHealthRoute(ctx))
323
+ return false;
324
+ const requiresAuthForVerbose = isVerboseHealthRequest(ctx) && config.security.allowRemote;
325
+ if (!requiresAuthForVerbose) {
326
+ sendHealthRouteResponse(this.store, ctx, false);
327
+ return true;
328
+ }
329
+ const healthAuth = await this.authenticateRequest(ctx);
330
+ if (!healthAuth)
331
+ return true;
332
+ sendHealthRouteResponse(this.store, ctx, true);
333
+ return true;
334
+ }
335
+ tryHandleDownloadRoute(ctx) {
336
+ if (ctx.method !== 'GET')
337
+ return false;
338
+ const download = checkDownloadRoute(ctx.url.pathname);
339
+ if (!download)
340
+ return false;
341
+ handleDownload(ctx.res, download.namespace, download.hash);
342
+ return true;
343
+ }
344
+ tryHandleProtectedResourceMetadataRoute(ctx) {
345
+ if (ctx.method !== 'GET')
346
+ return false;
347
+ if (!isProtectedResourceMetadataPath(ctx.url.pathname))
348
+ return false;
349
+ const document = buildProtectedResourceMetadataDocument(ctx.req);
350
+ sendJson(ctx.res, 200, document);
351
+ return true;
352
+ }
353
+ async dispatch(ctx) {
354
+ try {
355
+ if (await this.tryHandleHealthRoute(ctx))
356
+ return;
357
+ if (this.tryHandleProtectedResourceMetadataRoute(ctx))
358
+ return;
359
+ const auth = await this.authenticateRequest(ctx);
360
+ if (!auth)
361
+ return;
362
+ const authCtx = { ...ctx, auth };
363
+ if (this.tryHandleDownloadRoute(ctx))
364
+ return;
365
+ if (ctx.url.pathname === '/mcp') {
366
+ const handled = await this.handleMcpRoutes(authCtx);
367
+ if (handled)
368
+ return;
369
+ }
370
+ sendJson(ctx.res, 404, { error: 'Not Found' });
371
+ }
372
+ catch (err) {
373
+ const error = err instanceof Error ? err : new Error(String(err));
374
+ logError('Request failed', error);
375
+ if (!ctx.res.writableEnded) {
376
+ sendJson(ctx.res, 500, { error: 'Internal Server Error' });
377
+ }
378
+ }
379
+ }
380
+ async handleMcpRoutes(ctx) {
381
+ switch (ctx.method) {
382
+ case 'POST':
383
+ await this.mcpGateway.handlePost(ctx);
384
+ return true;
385
+ case 'GET':
386
+ await this.mcpGateway.handleGet(ctx);
387
+ return true;
388
+ case 'DELETE':
389
+ await this.mcpGateway.handleDelete(ctx);
390
+ return true;
391
+ default:
392
+ return false;
393
+ }
394
+ }
395
+ async authenticateRequest(ctx) {
396
+ try {
397
+ return await authService.authenticate(ctx.req, ctx.signal);
398
+ }
399
+ catch (err) {
400
+ applyUnauthorizedAuthHeaders(ctx.req, ctx.res);
401
+ sendJson(ctx.res, 401, {
402
+ error: err instanceof Error ? err.message : 'Unauthorized',
403
+ });
404
+ return null;
405
+ }
406
+ }
407
+ }
408
+ // ---------------------------------------------------------------------------
409
+ // Verbose health helper (local to dispatcher)
410
+ // ---------------------------------------------------------------------------
411
+ function isVerboseHealthRequest(ctx) {
412
+ const value = ctx.url.searchParams.get('verbose');
413
+ if (!value)
414
+ return false;
415
+ const normalized = value.trim().toLowerCase();
416
+ return normalized === '1' || normalized === 'true';
417
+ }
418
+ // ---------------------------------------------------------------------------
419
+ // Request pipeline
420
+ // ---------------------------------------------------------------------------
421
+ class HttpRequestPipeline {
422
+ rateLimiter;
423
+ dispatcher;
424
+ constructor(rateLimiter, dispatcher) {
425
+ this.rateLimiter = rateLimiter;
426
+ this.dispatcher = dispatcher;
427
+ }
428
+ async handle(rawReq, rawRes) {
429
+ const requestId = getHeaderValue(rawReq, 'x-request-id') ?? randomUUID();
430
+ const sessionId = getMcpSessionId(rawReq) ?? undefined;
431
+ const { signal, cleanup } = createRequestAbortSignal(rawReq);
432
+ try {
433
+ await runWithRequestContext({
434
+ requestId,
435
+ operationId: requestId,
436
+ ...(sessionId ? { sessionId } : {}),
437
+ }, async () => {
438
+ const duplicateHeader = findDuplicateSingleValueHeader(rawReq);
439
+ if (duplicateHeader) {
440
+ sendJson(rawRes, 400, {
441
+ error: `Duplicate ${duplicateHeader} header is not allowed`,
442
+ });
443
+ drainRequest(rawReq);
444
+ return;
445
+ }
446
+ const ctx = buildRequestContext(rawReq, rawRes, signal);
447
+ if (!ctx) {
448
+ drainRequest(rawReq);
449
+ return;
450
+ }
451
+ if (!hostOriginPolicy.validate(ctx)) {
452
+ drainRequest(rawReq);
453
+ return;
454
+ }
455
+ if (corsPolicy.handle(ctx)) {
456
+ drainRequest(rawReq);
457
+ return;
458
+ }
459
+ if (!this.rateLimiter.check(ctx)) {
460
+ drainRequest(rawReq);
461
+ return;
462
+ }
463
+ if (ctx.method === 'POST') {
464
+ try {
465
+ ctx.body = await jsonBodyReader.read(ctx.req, DEFAULT_BODY_LIMIT_BYTES, ctx.signal);
466
+ }
467
+ catch {
468
+ if (ctx.url.pathname === '/mcp') {
469
+ sendError(ctx.res, -32700, 'Parse error', 400, null);
470
+ }
471
+ else {
472
+ sendJson(ctx.res, 400, {
473
+ error: 'Invalid JSON or Payload too large',
474
+ });
475
+ }
476
+ drainRequest(rawReq);
477
+ return;
478
+ }
479
+ }
480
+ else {
481
+ const contentLengthHeader = getHeaderValue(rawReq, 'content-length');
482
+ const transferEncodingHeader = getHeaderValue(rawReq, 'transfer-encoding');
483
+ const hasRequestBody = (contentLengthHeader !== null &&
484
+ Number.parseInt(contentLengthHeader, 10) > 0) ||
485
+ transferEncodingHeader !== null;
486
+ if (hasRequestBody) {
487
+ drainRequest(rawReq);
488
+ }
489
+ ctx.body = undefined;
490
+ }
491
+ await this.dispatcher.dispatch(ctx);
492
+ });
493
+ }
494
+ finally {
495
+ cleanup();
496
+ }
497
+ }
498
+ }
499
+ // ---------------------------------------------------------------------------
500
+ // Server bootstrap
501
+ // ---------------------------------------------------------------------------
502
+ function handlePipelineError(error, res) {
503
+ logError('Request pipeline failed', error instanceof Error ? error : new Error(String(error)));
504
+ if (res.writableEnded)
505
+ return;
506
+ if (!res.headersSent) {
507
+ sendJson(res, 500, { error: 'Internal Server Error' });
508
+ return;
509
+ }
510
+ res.end();
511
+ }
512
+ function createNetworkServer(listener) {
513
+ const { https } = config.server;
514
+ if (!https.enabled) {
515
+ return createServer(listener);
516
+ }
517
+ const { keyFile, certFile, caFile } = https;
518
+ if (!keyFile || !certFile) {
519
+ throw new Error('HTTPS enabled but SERVER_TLS_KEY_FILE / SERVER_TLS_CERT_FILE are missing');
520
+ }
521
+ const tlsOptions = {
522
+ key: readFileSync(keyFile),
523
+ cert: readFileSync(certFile),
524
+ };
525
+ if (caFile) {
526
+ tlsOptions.ca = readFileSync(caFile);
527
+ }
528
+ return createHttpsServer(tlsOptions, listener);
529
+ }
530
+ async function listen(server, host, port) {
531
+ await new Promise((resolve, reject) => {
532
+ function onError(err) {
533
+ server.off('error', onError);
534
+ reject(err);
535
+ }
536
+ server.once('error', onError);
537
+ server.listen(port, host, () => {
538
+ server.off('error', onError);
539
+ resolve();
540
+ });
541
+ });
542
+ }
543
+ function resolveListeningPort(server, fallback) {
544
+ const addr = server.address();
545
+ if (addr && typeof addr === 'object')
546
+ return addr.port;
547
+ return fallback;
548
+ }
549
+ function createShutdownHandler(options) {
550
+ const closeBatchSize = 10;
551
+ return async (signal) => {
552
+ logInfo(`Stopping HTTP server (${signal})...`);
553
+ options.rateLimiter.stop();
554
+ options.sessionCleanup.abort();
555
+ drainConnectionsOnShutdown(options.server);
556
+ disableEventLoopMonitoring();
557
+ const sessions = options.sessionStore.clear();
558
+ for (let i = 0; i < sessions.length; i += closeBatchSize) {
559
+ const batch = sessions.slice(i, i + closeBatchSize);
560
+ await Promise.all(batch.map(async (session) => {
561
+ const sessionId = resolveMcpSessionIdByServer(session.server);
562
+ if (sessionId) {
563
+ cancelTasksForOwner(`session:${sessionId}`, 'The task was cancelled because the HTTP server is shutting down.');
564
+ unregisterMcpSessionServer(sessionId);
565
+ }
566
+ unregisterMcpSessionServerByServer(session.server);
567
+ await closeTransportBestEffort(session.transport, 'shutdown-session-close');
568
+ await closeMcpServerBestEffort(session.server, 'shutdown-session-close');
569
+ }));
570
+ }
571
+ await new Promise((resolve, reject) => {
572
+ options.server.close((err) => {
573
+ if (err)
574
+ reject(err);
575
+ else
576
+ resolve();
577
+ });
578
+ });
579
+ };
580
+ }
581
+ export async function startHttpServer() {
582
+ assertHttpModeConfiguration();
583
+ enableHttpMode();
584
+ resetEventLoopMonitoring();
585
+ const rateLimiter = createRateLimitManagerImpl(config.rateLimit);
586
+ const sessionStore = createSessionStore(config.server.sessionTtlMs);
587
+ const sessionCleanup = startSessionCleanupLoop(sessionStore, config.server.sessionTtlMs);
588
+ const mcpGateway = new McpSessionGateway(sessionStore, createMcpServerForHttpSession);
589
+ const dispatcher = new HttpDispatcher(sessionStore, mcpGateway);
590
+ const pipeline = new HttpRequestPipeline(rateLimiter, dispatcher);
591
+ const server = createNetworkServer((req, res) => {
592
+ void pipeline.handle(req, res).catch((error) => {
593
+ handlePipelineError(error, res);
594
+ });
595
+ });
596
+ registerInboundBlockList(server);
597
+ applyHttpServerTuning(server);
598
+ await listen(server, config.server.host, config.server.port);
599
+ const port = resolveListeningPort(server, config.server.port);
600
+ const protocol = config.server.https.enabled ? 'https' : 'http';
601
+ logInfo(`${protocol.toUpperCase()} server listening on port ${port}`, {
602
+ platform: process.platform,
603
+ arch: process.arch,
604
+ hostname: hostname(),
605
+ nodeVersion: process.version,
606
+ });
607
+ return {
608
+ port,
609
+ host: config.server.host,
610
+ shutdown: createShutdownHandler({
611
+ server,
612
+ rateLimiter,
613
+ sessionCleanup,
614
+ sessionStore,
615
+ }),
616
+ };
617
+ }
618
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/http/native.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type RequestContext } from './helpers.js';
2
+ export interface RateLimitConfig {
3
+ maxRequests: number;
4
+ windowMs: number;
5
+ cleanupIntervalMs: number;
6
+ enabled: boolean;
7
+ }
8
+ export interface RateLimitManagerImpl {
9
+ check(ctx: RequestContext): boolean;
10
+ stop(): void;
11
+ }
12
+ export declare function createRateLimitManagerImpl(options: RateLimitConfig): RateLimitManagerImpl;
13
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/http/rate-limit.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,cAAc,CAAC;AAY7D,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC;IACpC,IAAI,IAAI,IAAI,CAAC;CACd;AAgGD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,eAAe,GACvB,oBAAoB,CAEtB"}