agents 0.0.0-ccbea72 → 0.0.0-cd8b7fd

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 (67) hide show
  1. package/README.md +5 -3
  2. package/dist/ai-chat-agent.d.ts +95 -13
  3. package/dist/ai-chat-agent.js +354 -74
  4. package/dist/ai-chat-agent.js.map +1 -1
  5. package/dist/{ai-chat-v5-migration-DBHGW4Hv.js → ai-chat-v5-migration-DguhuLKF.js} +1 -1
  6. package/dist/{ai-chat-v5-migration-DBHGW4Hv.js.map → ai-chat-v5-migration-DguhuLKF.js.map} +1 -1
  7. package/dist/ai-chat-v5-migration.js +1 -1
  8. package/dist/ai-react.d.ts +15 -9
  9. package/dist/ai-react.js +179 -29
  10. package/dist/ai-react.js.map +1 -1
  11. package/dist/{ai-types-B3aQaFv3.js → ai-types-CwgHzwUb.js} +5 -1
  12. package/dist/ai-types-CwgHzwUb.js.map +1 -0
  13. package/dist/{ai-types-D5YoPrBZ.d.ts → ai-types-D_hTbf25.d.ts} +15 -7
  14. package/dist/ai-types.d.ts +1 -1
  15. package/dist/ai-types.js +1 -1
  16. package/dist/cli/index.d.ts +1 -0
  17. package/dist/cli/index.js +28 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/{client-BfiZ3HQd.js → client-CcyhkGfN.js} +2 -2
  20. package/dist/{client-BfiZ3HQd.js.map → client-CcyhkGfN.js.map} +1 -1
  21. package/dist/{client-CbWe9FBd.d.ts → client-ClORm6f0.d.ts} +2 -2
  22. package/dist/client-DfIOsabL.d.ts +834 -0
  23. package/dist/client-QZa2Rq0l.js +1105 -0
  24. package/dist/client-QZa2Rq0l.js.map +1 -0
  25. package/dist/client.d.ts +2 -2
  26. package/dist/client.js +2 -2
  27. package/dist/codemode/ai.js +6 -5
  28. package/dist/codemode/ai.js.map +1 -1
  29. package/dist/context-BkKbAa1R.js +8 -0
  30. package/dist/context-BkKbAa1R.js.map +1 -0
  31. package/dist/context-_sPQqJWv.d.ts +24 -0
  32. package/dist/context.d.ts +6 -0
  33. package/dist/context.js +3 -0
  34. package/dist/{do-oauth-client-provider-DGc5pP0l.d.ts → do-oauth-client-provider-B-ryFIPr.d.ts} +20 -5
  35. package/dist/{do-oauth-client-provider-CswoD5Lu.js → do-oauth-client-provider-B1fVIshX.js} +70 -8
  36. package/dist/do-oauth-client-provider-B1fVIshX.js.map +1 -0
  37. package/dist/{index-DhJCaDWd.d.ts → index-CyDpAVHZ.d.ts} +2 -2
  38. package/dist/{index-D6iosdF4.d.ts → index-DPJ32qQn.d.ts} +83 -66
  39. package/dist/index.d.ts +34 -34
  40. package/dist/index.js +6 -5
  41. package/dist/mcp/client.d.ts +4 -4
  42. package/dist/mcp/client.js +2 -1
  43. package/dist/mcp/do-oauth-client-provider.d.ts +1 -1
  44. package/dist/mcp/do-oauth-client-provider.js +1 -1
  45. package/dist/mcp/index.d.ts +89 -24
  46. package/dist/mcp/index.js +294 -81
  47. package/dist/mcp/index.js.map +1 -1
  48. package/dist/mcp/x402.js +10 -6
  49. package/dist/mcp/x402.js.map +1 -1
  50. package/dist/{mcp-Dw5vDrY8.d.ts → mcp-CzbSsLfc.d.ts} +1 -1
  51. package/dist/observability/index.d.ts +2 -2
  52. package/dist/observability/index.js +6 -5
  53. package/dist/{react-YzfC33jB.d.ts → react-MaOSl7Pr.d.ts} +33 -35
  54. package/dist/react.d.ts +10 -9
  55. package/dist/react.js +2 -2
  56. package/dist/react.js.map +1 -1
  57. package/dist/{serializable-CymX8ovI.d.ts → serializable-C4GLimgv.d.ts} +1 -1
  58. package/dist/serializable.d.ts +1 -1
  59. package/dist/{src-Dz0H9hSU.js → src-BmbDclOA.js} +128 -147
  60. package/dist/src-BmbDclOA.js.map +1 -0
  61. package/package.json +53 -38
  62. package/dist/ai-types-B3aQaFv3.js.map +0 -1
  63. package/dist/client-9Ld2_lnt.js +0 -786
  64. package/dist/client-9Ld2_lnt.js.map +0 -1
  65. package/dist/client-BmMRlvlM.d.ts +0 -5313
  66. package/dist/do-oauth-client-provider-CswoD5Lu.js.map +0 -1
  67. package/dist/src-Dz0H9hSU.js.map +0 -1
package/dist/mcp/index.js CHANGED
@@ -1,9 +1,12 @@
1
- import { t as MessageType } from "../ai-types-B3aQaFv3.js";
2
- import "../client-BfiZ3HQd.js";
3
- import { a as SSEEdgeClientTransport, i as StreamableHTTPEdgeClientTransport } from "../client-9Ld2_lnt.js";
4
- import "../do-oauth-client-provider-CswoD5Lu.js";
5
- import { c as getCurrentAgent, s as getAgentByName, t as Agent } from "../src-Dz0H9hSU.js";
1
+ import "../context-BkKbAa1R.js";
2
+ import { t as MessageType } from "../ai-types-CwgHzwUb.js";
3
+ import "../client-CcyhkGfN.js";
4
+ import "../client-QZa2Rq0l.js";
5
+ import "../do-oauth-client-provider-B1fVIshX.js";
6
+ import { c as getCurrentAgent, s as getAgentByName, t as Agent } from "../src-BmbDclOA.js";
6
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
9
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
7
10
  import { ElicitRequestSchema, InitializeRequestSchema, JSONRPCMessageSchema, isInitializeRequest, isJSONRPCError, isJSONRPCNotification, isJSONRPCRequest, isJSONRPCResponse } from "@modelcontextprotocol/sdk/types.js";
8
11
 
9
12
  //#region src/mcp/utils.ts
@@ -21,7 +24,7 @@ const MCP_HTTP_METHOD_HEADER = "cf-mcp-method";
21
24
  */
22
25
  const MCP_MESSAGE_HEADER = "cf-mcp-message";
23
26
  const MAXIMUM_MESSAGE_SIZE_BYTES = 4 * 1024 * 1024;
24
- const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
27
+ const createStreamingHttpHandler = (basePath, namespace, options = {}) => {
25
28
  let pathname = basePath;
26
29
  if (basePath === "/") pathname = "/*";
27
30
  const basePattern = new URLPattern({ pathname });
@@ -130,7 +133,10 @@ const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
130
133
  return new Response(body$1, { status: 400 });
131
134
  }
132
135
  sessionId = sessionId ?? namespace.newUniqueId().toString();
133
- const agent = await getAgentByName(namespace, `streamable-http:${sessionId}`, { props: ctx.props });
136
+ const agent = await getAgentByName(namespace, `streamable-http:${sessionId}`, {
137
+ props: ctx.props,
138
+ jurisdiction: options.jurisdiction
139
+ });
134
140
  const isInitialized = await agent.getInitializeRequest();
135
141
  if (maybeInitializeRequest) await agent.setInitializeRequest(maybeInitializeRequest);
136
142
  else if (!isInitialized) {
@@ -205,7 +211,7 @@ const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
205
211
  if (messages.every((msg) => isJSONRPCNotification(msg) || isJSONRPCResponse(msg))) {
206
212
  ws.close();
207
213
  return new Response(null, {
208
- headers: corsHeaders(request, corsOptions),
214
+ headers: corsHeaders(request, options.corsOptions),
209
215
  status: 202
210
216
  });
211
217
  }
@@ -215,7 +221,7 @@ const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
215
221
  Connection: "keep-alive",
216
222
  "Content-Type": "text/event-stream",
217
223
  "mcp-session-id": sessionId,
218
- ...corsHeaders(request, corsOptions)
224
+ ...corsHeaders(request, options.corsOptions)
219
225
  },
220
226
  status: 200
221
227
  });
@@ -243,7 +249,10 @@ const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
243
249
  const { readable, writable } = new TransformStream();
244
250
  const writer = writable.getWriter();
245
251
  const encoder = new TextEncoder();
246
- const agent = await getAgentByName(namespace, `streamable-http:${sessionId}`, { props: ctx.props });
252
+ const agent = await getAgentByName(namespace, `streamable-http:${sessionId}`, {
253
+ props: ctx.props,
254
+ jurisdiction: options.jurisdiction
255
+ });
247
256
  if (!await agent.getInitializeRequest()) return new Response(JSON.stringify({
248
257
  jsonrpc: "2.0",
249
258
  error: {
@@ -292,7 +301,7 @@ const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
292
301
  Connection: "keep-alive",
293
302
  "Content-Type": "text/event-stream",
294
303
  "mcp-session-id": sessionId,
295
- ...corsHeaders(request, corsOptions)
304
+ ...corsHeaders(request, options.corsOptions)
296
305
  },
297
306
  status: 200
298
307
  });
@@ -307,9 +316,9 @@ const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
307
316
  id: null
308
317
  }), {
309
318
  status: 400,
310
- headers: corsHeaders(request, corsOptions)
319
+ headers: corsHeaders(request, options.corsOptions)
311
320
  });
312
- const agent = await getAgentByName(namespace, `streamable-http:${sessionId}`);
321
+ const agent = await getAgentByName(namespace, `streamable-http:${sessionId}`, { jurisdiction: options.jurisdiction });
313
322
  if (!await agent.getInitializeRequest()) return new Response(JSON.stringify({
314
323
  jsonrpc: "2.0",
315
324
  error: {
@@ -319,12 +328,12 @@ const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
319
328
  id: null
320
329
  }), {
321
330
  status: 404,
322
- headers: corsHeaders(request, corsOptions)
331
+ headers: corsHeaders(request, options.corsOptions)
323
332
  });
324
333
  ctx.waitUntil(agent.destroy().catch(() => {}));
325
334
  return new Response(null, {
326
335
  status: 204,
327
- headers: corsHeaders(request, corsOptions)
336
+ headers: corsHeaders(request, options.corsOptions)
328
337
  });
329
338
  }
330
339
  }
@@ -339,7 +348,7 @@ const createStreamingHttpHandler = (basePath, namespace, corsOptions) => {
339
348
  return new Response(body, { status: 404 });
340
349
  };
341
350
  };
342
- const createLegacySseHandler = (basePath, namespace, corsOptions) => {
351
+ const createLegacySseHandler = (basePath, namespace, options = {}) => {
343
352
  let pathname = basePath;
344
353
  if (basePath === "/") pathname = "/*";
345
354
  const basePattern = new URLPattern({ pathname });
@@ -356,7 +365,10 @@ const createLegacySseHandler = (basePath, namespace, corsOptions) => {
356
365
  endpointUrl.searchParams.set("sessionId", sessionId);
357
366
  const endpointMessage = `event: endpoint\ndata: ${endpointUrl.pathname + endpointUrl.search + endpointUrl.hash}\n\n`;
358
367
  writer.write(encoder.encode(endpointMessage));
359
- const agent = await getAgentByName(namespace, `sse:${sessionId}`, { props: ctx.props });
368
+ const agent = await getAgentByName(namespace, `sse:${sessionId}`, {
369
+ props: ctx.props,
370
+ jurisdiction: options.jurisdiction
371
+ });
360
372
  const existingHeaders = {};
361
373
  request.headers.forEach((value, key) => {
362
374
  existingHeaders[key] = value;
@@ -408,7 +420,7 @@ const createLegacySseHandler = (basePath, namespace, corsOptions) => {
408
420
  "Cache-Control": "no-cache",
409
421
  Connection: "keep-alive",
410
422
  "Content-Type": "text/event-stream",
411
- ...corsHeaders(request, corsOptions)
423
+ ...corsHeaders(request, options.corsOptions)
412
424
  } });
413
425
  }
414
426
  if (request.method === "POST" && messagePattern.test(url)) {
@@ -418,15 +430,19 @@ const createLegacySseHandler = (basePath, namespace, corsOptions) => {
418
430
  if (!contentType.includes("application/json")) return new Response(`Unsupported content-type: ${contentType}`, { status: 400 });
419
431
  const contentLength = Number.parseInt(request.headers.get("content-length") || "0", 10);
420
432
  if (contentLength > MAXIMUM_MESSAGE_SIZE_BYTES) return new Response(`Request body too large: ${contentLength} bytes`, { status: 400 });
421
- const agent = await getAgentByName(namespace, `sse:${sessionId}`, { props: ctx.props });
433
+ const agent = await getAgentByName(namespace, `sse:${sessionId}`, {
434
+ props: ctx.props,
435
+ jurisdiction: options.jurisdiction
436
+ });
422
437
  const messageBody = await request.json();
423
- const error = await agent.onSSEMcpMessage(sessionId, messageBody);
438
+ const extraInfo = { requestInfo: { headers: Object.fromEntries(request.headers.entries()) } };
439
+ const error = await agent.onSSEMcpMessage(sessionId, messageBody, extraInfo);
424
440
  if (error) return new Response(error.message, {
425
441
  headers: {
426
442
  "Cache-Control": "no-cache",
427
443
  Connection: "keep-alive",
428
444
  "Content-Type": "text/event-stream",
429
- ...corsHeaders(request, corsOptions)
445
+ ...corsHeaders(request, options.corsOptions)
430
446
  },
431
447
  status: 400
432
448
  });
@@ -435,7 +451,7 @@ const createLegacySseHandler = (basePath, namespace, corsOptions) => {
435
451
  "Cache-Control": "no-cache",
436
452
  Connection: "keep-alive",
437
453
  "Content-Type": "text/event-stream",
438
- ...corsHeaders(request, corsOptions)
454
+ ...corsHeaders(request, options.corsOptions)
439
455
  },
440
456
  status: 202
441
457
  });
@@ -464,9 +480,12 @@ function isDurableObjectNamespace(namespace) {
464
480
  //#endregion
465
481
  //#region src/mcp/transport.ts
466
482
  var McpSSETransport = class {
467
- constructor(getWebSocket) {
483
+ constructor() {
468
484
  this._started = false;
469
- this._getWebSocket = getWebSocket;
485
+ const { agent } = getCurrentAgent();
486
+ if (!agent) throw new Error("McpAgent was not found in Transport constructor");
487
+ this.sessionId = agent.getSessionId();
488
+ this._getWebSocket = () => agent.getWebSocket();
470
489
  }
471
490
  async start() {
472
491
  if (this._started) throw new Error("Transport already started");
@@ -625,8 +644,43 @@ var StreamableHTTPServerTransport = class {
625
644
  }
626
645
  };
627
646
 
647
+ //#endregion
648
+ //#region src/mcp/client-transports.ts
649
+ /**
650
+ * Deprecated transport wrappers
651
+ */
652
+ let didWarnAboutSSEEdgeClientTransport = false;
653
+ /**
654
+ * @deprecated Use SSEClientTransport from @modelcontextprotocol/sdk/client/sse.js instead. This alias will be removed in the next major version.
655
+ */
656
+ var SSEEdgeClientTransport = class extends SSEClientTransport {
657
+ constructor(url, options) {
658
+ super(url, options);
659
+ if (!didWarnAboutSSEEdgeClientTransport) {
660
+ didWarnAboutSSEEdgeClientTransport = true;
661
+ console.warn("SSEEdgeClientTransport is deprecated. Use SSEClientTransport from @modelcontextprotocol/sdk/client/sse.js instead. SSEEdgeClientTransport will be removed in the next major version.");
662
+ }
663
+ }
664
+ };
665
+ let didWarnAboutStreamableHTTPEdgeClientTransport = false;
666
+ /**
667
+ * @deprecated Use StreamableHTTPClientTransport from @modelcontextprotocol/sdk/client/streamableHttp.js instead. This alias will be removed in the next major version.
668
+ */
669
+ var StreamableHTTPEdgeClientTransport = class extends StreamableHTTPClientTransport {
670
+ constructor(url, options) {
671
+ super(url, options);
672
+ if (!didWarnAboutStreamableHTTPEdgeClientTransport) {
673
+ didWarnAboutStreamableHTTPEdgeClientTransport = true;
674
+ console.warn("StreamableHTTPEdgeClientTransport is deprecated. Use StreamableHTTPClientTransport from @modelcontextprotocol/sdk/client/streamableHttp.js instead. StreamableHTTPEdgeClientTransport will be removed in the next major version.");
675
+ }
676
+ }
677
+ };
678
+
628
679
  //#endregion
629
680
  //#region src/mcp/worker-transport.ts
681
+ const SUPPORTED_PROTOCOL_VERSIONS = ["2025-03-26", "2025-06-18"];
682
+ const DEFAULT_PROTOCOL_VERSION = "2025-03-26";
683
+ const MCP_PROTOCOL_VERSION_HEADER = "MCP-Protocol-Version";
630
684
  var WorkerTransport = class {
631
685
  constructor(options) {
632
686
  this.started = false;
@@ -636,15 +690,113 @@ var WorkerTransport = class {
636
690
  this.streamMapping = /* @__PURE__ */ new Map();
637
691
  this.requestToStreamMapping = /* @__PURE__ */ new Map();
638
692
  this.requestResponseMap = /* @__PURE__ */ new Map();
693
+ this.stateRestored = false;
639
694
  this.sessionIdGenerator = options?.sessionIdGenerator;
640
695
  this.enableJsonResponse = options?.enableJsonResponse ?? false;
641
696
  this.onsessioninitialized = options?.onsessioninitialized;
697
+ this.corsOptions = options?.corsOptions;
698
+ this.storage = options?.storage;
699
+ }
700
+ /**
701
+ * Restore transport state from persistent storage.
702
+ * This is automatically called on start.
703
+ */
704
+ async restoreState() {
705
+ if (!this.storage || this.stateRestored) return;
706
+ const state = await Promise.resolve(this.storage.get());
707
+ if (state) {
708
+ this.sessionId = state.sessionId;
709
+ this.initialized = state.initialized;
710
+ this.protocolVersion = state.protocolVersion;
711
+ }
712
+ this.stateRestored = true;
713
+ }
714
+ /**
715
+ * Persist current transport state to storage.
716
+ */
717
+ async saveState() {
718
+ if (!this.storage) return;
719
+ const state = {
720
+ sessionId: this.sessionId,
721
+ initialized: this.initialized,
722
+ protocolVersion: this.protocolVersion
723
+ };
724
+ await Promise.resolve(this.storage.set(state));
642
725
  }
643
726
  async start() {
644
727
  if (this.started) throw new Error("Transport already started");
645
728
  this.started = true;
646
729
  }
730
+ validateProtocolVersion(request) {
731
+ const versionHeader = request.headers.get(MCP_PROTOCOL_VERSION_HEADER);
732
+ if (!versionHeader) {
733
+ if (!this.protocolVersion || this.protocolVersion === DEFAULT_PROTOCOL_VERSION) return;
734
+ return new Response(JSON.stringify({
735
+ jsonrpc: "2.0",
736
+ error: {
737
+ code: -32e3,
738
+ message: `Bad Request: ${MCP_PROTOCOL_VERSION_HEADER} header is required`
739
+ },
740
+ id: null
741
+ }), {
742
+ status: 400,
743
+ headers: {
744
+ "Content-Type": "application/json",
745
+ ...this.getHeaders()
746
+ }
747
+ });
748
+ }
749
+ if (!SUPPORTED_PROTOCOL_VERSIONS.includes(versionHeader)) return new Response(JSON.stringify({
750
+ jsonrpc: "2.0",
751
+ error: {
752
+ code: -32e3,
753
+ message: `Bad Request: Unsupported ${MCP_PROTOCOL_VERSION_HEADER}: ${versionHeader}. Supported versions: ${SUPPORTED_PROTOCOL_VERSIONS.join(", ")}`
754
+ },
755
+ id: null
756
+ }), {
757
+ status: 400,
758
+ headers: {
759
+ "Content-Type": "application/json",
760
+ ...this.getHeaders()
761
+ }
762
+ });
763
+ if (this.protocolVersion && versionHeader !== this.protocolVersion) return new Response(JSON.stringify({
764
+ jsonrpc: "2.0",
765
+ error: {
766
+ code: -32e3,
767
+ message: `Bad Request: ${MCP_PROTOCOL_VERSION_HEADER} mismatch. Expected: ${this.protocolVersion}, Got: ${versionHeader}`
768
+ },
769
+ id: null
770
+ }), {
771
+ status: 400,
772
+ headers: {
773
+ "Content-Type": "application/json",
774
+ ...this.getHeaders()
775
+ }
776
+ });
777
+ }
778
+ getHeaders({ forPreflight } = {}) {
779
+ const options = {
780
+ origin: "*",
781
+ headers: "Content-Type, Accept, Authorization, mcp-session-id, MCP-Protocol-Version",
782
+ methods: "GET, POST, DELETE, OPTIONS",
783
+ exposeHeaders: "mcp-session-id",
784
+ maxAge: 86400,
785
+ ...this.corsOptions
786
+ };
787
+ if (forPreflight) return {
788
+ "Access-Control-Allow-Origin": options.origin,
789
+ "Access-Control-Allow-Headers": options.headers,
790
+ "Access-Control-Allow-Methods": options.methods,
791
+ "Access-Control-Max-Age": options.maxAge.toString()
792
+ };
793
+ return {
794
+ "Access-Control-Allow-Origin": options.origin,
795
+ "Access-Control-Expose-Headers": options.exposeHeaders
796
+ };
797
+ }
647
798
  async handleRequest(request, parsedBody) {
799
+ await this.restoreState();
648
800
  switch (request.method) {
649
801
  case "OPTIONS": return this.handleOptionsRequest(request);
650
802
  case "GET": return this.handleGetRequest(request);
@@ -663,10 +815,15 @@ var WorkerTransport = class {
663
815
  id: null
664
816
  }), {
665
817
  status: 406,
666
- headers: { "Content-Type": "application/json" }
818
+ headers: {
819
+ "Content-Type": "application/json",
820
+ ...this.getHeaders()
821
+ }
667
822
  });
668
- const sessionValid = this.validateSession(request);
669
- if (sessionValid !== true) return sessionValid;
823
+ const sessionError = this.validateSession(request);
824
+ if (sessionError) return sessionError;
825
+ const versionError = this.validateProtocolVersion(request);
826
+ if (versionError) return versionError;
670
827
  const streamId = this.standaloneSseStreamId;
671
828
  if (this.streamMapping.get(streamId) !== void 0) return new Response(JSON.stringify({
672
829
  jsonrpc: "2.0",
@@ -677,7 +834,10 @@ var WorkerTransport = class {
677
834
  id: null
678
835
  }), {
679
836
  status: 409,
680
- headers: { "Content-Type": "application/json" }
837
+ headers: {
838
+ "Content-Type": "application/json",
839
+ ...this.getHeaders()
840
+ }
681
841
  });
682
842
  const { readable, writable } = new TransformStream();
683
843
  const writer = writable.getWriter();
@@ -686,8 +846,7 @@ var WorkerTransport = class {
686
846
  "Content-Type": "text/event-stream",
687
847
  "Cache-Control": "no-cache",
688
848
  Connection: "keep-alive",
689
- "Access-Control-Allow-Origin": "*",
690
- "Access-Control-Expose-Headers": "mcp-session-id"
849
+ ...this.getHeaders()
691
850
  });
692
851
  if (this.sessionId !== void 0) headers.set("mcp-session-id", this.sessionId);
693
852
  const keepAlive = setInterval(() => {
@@ -710,7 +869,7 @@ var WorkerTransport = class {
710
869
  }
711
870
  async handlePostRequest(request, parsedBody) {
712
871
  const acceptHeader = request.headers.get("Accept");
713
- if (!acceptHeader?.includes("application/json") || !acceptHeader.includes("text/event-stream")) return new Response(JSON.stringify({
872
+ if (!acceptHeader?.includes("application/json") || !acceptHeader?.includes("text/event-stream")) return new Response(JSON.stringify({
714
873
  jsonrpc: "2.0",
715
874
  error: {
716
875
  code: -32e3,
@@ -719,7 +878,10 @@ var WorkerTransport = class {
719
878
  id: null
720
879
  }), {
721
880
  status: 406,
722
- headers: { "Content-Type": "application/json" }
881
+ headers: {
882
+ "Content-Type": "application/json",
883
+ ...this.getHeaders()
884
+ }
723
885
  });
724
886
  if (!request.headers.get("Content-Type")?.includes("application/json")) return new Response(JSON.stringify({
725
887
  jsonrpc: "2.0",
@@ -730,7 +892,10 @@ var WorkerTransport = class {
730
892
  id: null
731
893
  }), {
732
894
  status: 415,
733
- headers: { "Content-Type": "application/json" }
895
+ headers: {
896
+ "Content-Type": "application/json",
897
+ ...this.getHeaders()
898
+ }
734
899
  });
735
900
  let rawMessage = parsedBody;
736
901
  if (rawMessage === void 0) try {
@@ -745,7 +910,10 @@ var WorkerTransport = class {
745
910
  id: null
746
911
  }), {
747
912
  status: 400,
748
- headers: { "Content-Type": "application/json" }
913
+ headers: {
914
+ "Content-Type": "application/json",
915
+ ...this.getHeaders()
916
+ }
749
917
  });
750
918
  }
751
919
  let messages;
@@ -762,9 +930,13 @@ var WorkerTransport = class {
762
930
  id: null
763
931
  }), {
764
932
  status: 400,
765
- headers: { "Content-Type": "application/json" }
933
+ headers: {
934
+ "Content-Type": "application/json",
935
+ ...this.getHeaders()
936
+ }
766
937
  });
767
938
  }
939
+ const requestInfo = { headers: Object.fromEntries(request.headers.entries()) };
768
940
  const isInitializationRequest = messages.some(isInitializeRequest);
769
941
  if (isInitializationRequest) {
770
942
  if (this.initialized && this.sessionId !== void 0) return new Response(JSON.stringify({
@@ -776,7 +948,10 @@ var WorkerTransport = class {
776
948
  id: null
777
949
  }), {
778
950
  status: 400,
779
- headers: { "Content-Type": "application/json" }
951
+ headers: {
952
+ "Content-Type": "application/json",
953
+ ...this.getHeaders()
954
+ }
780
955
  });
781
956
  if (messages.length > 1) return new Response(JSON.stringify({
782
957
  jsonrpc: "2.0",
@@ -787,21 +962,33 @@ var WorkerTransport = class {
787
962
  id: null
788
963
  }), {
789
964
  status: 400,
790
- headers: { "Content-Type": "application/json" }
965
+ headers: {
966
+ "Content-Type": "application/json",
967
+ ...this.getHeaders()
968
+ }
791
969
  });
970
+ const initRequest = messages.find(isInitializeRequest);
971
+ if (initRequest?.params) {
972
+ const version = initRequest.params.protocolVersion;
973
+ if (version && SUPPORTED_PROTOCOL_VERSIONS.includes(version)) this.protocolVersion = version;
974
+ else this.protocolVersion = DEFAULT_PROTOCOL_VERSION;
975
+ }
792
976
  this.sessionId = this.sessionIdGenerator?.();
793
977
  this.initialized = true;
978
+ await this.saveState();
794
979
  if (this.sessionId && this.onsessioninitialized) this.onsessioninitialized(this.sessionId);
795
980
  }
796
981
  if (!isInitializationRequest) {
797
- const sessionValid = this.validateSession(request);
798
- if (sessionValid !== true) return sessionValid;
982
+ const sessionError = this.validateSession(request);
983
+ if (sessionError) return sessionError;
984
+ const versionError = this.validateProtocolVersion(request);
985
+ if (versionError) return versionError;
799
986
  }
800
987
  if (!messages.some(isJSONRPCRequest)) {
801
- for (const message of messages) this.onmessage?.(message);
988
+ for (const message of messages) this.onmessage?.(message, { requestInfo });
802
989
  return new Response(null, {
803
990
  status: 202,
804
- headers: { "Access-Control-Allow-Origin": "*" }
991
+ headers: { ...this.getHeaders() }
805
992
  });
806
993
  }
807
994
  const streamId = crypto.randomUUID();
@@ -813,7 +1000,7 @@ var WorkerTransport = class {
813
1000
  }
814
1001
  });
815
1002
  for (const message of messages) if (isJSONRPCRequest(message)) this.requestToStreamMapping.set(message.id, streamId);
816
- for (const message of messages) this.onmessage?.(message);
1003
+ for (const message of messages) this.onmessage?.(message, { requestInfo });
817
1004
  });
818
1005
  const { readable, writable } = new TransformStream();
819
1006
  const writer = writable.getWriter();
@@ -822,8 +1009,7 @@ var WorkerTransport = class {
822
1009
  "Content-Type": "text/event-stream",
823
1010
  "Cache-Control": "no-cache",
824
1011
  Connection: "keep-alive",
825
- "Access-Control-Allow-Origin": "*",
826
- "Access-Control-Expose-Headers": "mcp-session-id"
1012
+ ...this.getHeaders()
827
1013
  });
828
1014
  if (this.sessionId !== void 0) headers.set("mcp-session-id", this.sessionId);
829
1015
  this.streamMapping.set(streamId, {
@@ -835,28 +1021,24 @@ var WorkerTransport = class {
835
1021
  }
836
1022
  });
837
1023
  for (const message of messages) if (isJSONRPCRequest(message)) this.requestToStreamMapping.set(message.id, streamId);
838
- for (const message of messages) this.onmessage?.(message);
1024
+ for (const message of messages) this.onmessage?.(message, { requestInfo });
839
1025
  return new Response(readable, { headers });
840
1026
  }
841
1027
  async handleDeleteRequest(request) {
842
- const sessionValid = this.validateSession(request);
843
- if (sessionValid !== true) return sessionValid;
1028
+ const sessionError = this.validateSession(request);
1029
+ if (sessionError) return sessionError;
1030
+ const versionError = this.validateProtocolVersion(request);
1031
+ if (versionError) return versionError;
844
1032
  await this.close();
845
1033
  return new Response(null, {
846
1034
  status: 200,
847
- headers: { "Access-Control-Allow-Origin": "*" }
1035
+ headers: { ...this.getHeaders() }
848
1036
  });
849
1037
  }
850
1038
  handleOptionsRequest(_request) {
851
- const headers = new Headers({
852
- "Access-Control-Allow-Origin": "*",
853
- "Access-Control-Allow-Methods": "GET, POST, DELETE, OPTIONS",
854
- "Access-Control-Allow-Headers": "Content-Type, Accept, Authorization, mcp-session-id",
855
- "Access-Control-Max-Age": "86400"
856
- });
857
1039
  return new Response(null, {
858
- status: 204,
859
- headers
1040
+ status: 200,
1041
+ headers: { ...this.getHeaders({ forPreflight: true }) }
860
1042
  });
861
1043
  }
862
1044
  handleUnsupportedRequest() {
@@ -876,7 +1058,7 @@ var WorkerTransport = class {
876
1058
  });
877
1059
  }
878
1060
  validateSession(request) {
879
- if (this.sessionIdGenerator === void 0) return true;
1061
+ if (this.sessionIdGenerator === void 0) return;
880
1062
  if (!this.initialized) return new Response(JSON.stringify({
881
1063
  jsonrpc: "2.0",
882
1064
  error: {
@@ -886,7 +1068,10 @@ var WorkerTransport = class {
886
1068
  id: null
887
1069
  }), {
888
1070
  status: 400,
889
- headers: { "Content-Type": "application/json" }
1071
+ headers: {
1072
+ "Content-Type": "application/json",
1073
+ ...this.getHeaders()
1074
+ }
890
1075
  });
891
1076
  const sessionId = request.headers.get("mcp-session-id");
892
1077
  if (!sessionId) return new Response(JSON.stringify({
@@ -898,7 +1083,10 @@ var WorkerTransport = class {
898
1083
  id: null
899
1084
  }), {
900
1085
  status: 400,
901
- headers: { "Content-Type": "application/json" }
1086
+ headers: {
1087
+ "Content-Type": "application/json",
1088
+ ...this.getHeaders()
1089
+ }
902
1090
  });
903
1091
  if (sessionId !== this.sessionId) return new Response(JSON.stringify({
904
1092
  jsonrpc: "2.0",
@@ -909,9 +1097,11 @@ var WorkerTransport = class {
909
1097
  id: null
910
1098
  }), {
911
1099
  status: 404,
912
- headers: { "Content-Type": "application/json" }
1100
+ headers: {
1101
+ "Content-Type": "application/json",
1102
+ ...this.getHeaders()
1103
+ }
913
1104
  });
914
- return true;
915
1105
  }
916
1106
  async close() {
917
1107
  for (const { cleanup } of this.streamMapping.values()) cleanup();
@@ -919,8 +1109,8 @@ var WorkerTransport = class {
919
1109
  this.requestResponseMap.clear();
920
1110
  this.onclose?.();
921
1111
  }
922
- async send(message) {
923
- let requestId;
1112
+ async send(message, options) {
1113
+ let requestId = options?.relatedRequestId;
924
1114
  if (isJSONRPCResponse(message) || isJSONRPCError(message)) requestId = message.id;
925
1115
  if (requestId === void 0) {
926
1116
  if (isJSONRPCResponse(message) || isJSONRPCError(message)) throw new Error("Cannot send a response on a standalone SSE stream unless resuming a previous client request");
@@ -950,8 +1140,7 @@ var WorkerTransport = class {
950
1140
  const responses = relatedIds.map((id) => this.requestResponseMap.get(id));
951
1141
  const headers = new Headers({
952
1142
  "Content-Type": "application/json",
953
- "Access-Control-Allow-Origin": "*",
954
- "Access-Control-Expose-Headers": "mcp-session-id"
1143
+ ...this.getHeaders()
955
1144
  });
956
1145
  if (this.sessionId !== void 0) headers.set("mcp-session-id", this.sessionId);
957
1146
  const body = responses.length === 1 ? responses[0] : responses;
@@ -978,23 +1167,30 @@ function runWithAuthContext(context, fn) {
978
1167
 
979
1168
  //#endregion
980
1169
  //#region src/mcp/handler.ts
981
- function experimental_createMcpHandler(server, options = {}) {
1170
+ function createMcpHandler(server, options = {}) {
982
1171
  const route = options.route ?? "/mcp";
983
1172
  return async (request, _env, ctx) => {
984
1173
  const url = new URL(request.url);
985
1174
  if (route && url.pathname !== route) return new Response("Not Found", { status: 404 });
986
- const oauthCtx = ctx;
987
- const authContext = oauthCtx.props ? { props: oauthCtx.props } : void 0;
988
- const transport = new WorkerTransport(options);
989
- await server.connect(transport);
1175
+ const transport = options.transport ?? new WorkerTransport({
1176
+ sessionIdGenerator: options.sessionIdGenerator,
1177
+ enableJsonResponse: options.enableJsonResponse,
1178
+ onsessioninitialized: options.onsessioninitialized,
1179
+ corsOptions: options.corsOptions,
1180
+ storage: options.storage
1181
+ });
1182
+ const buildAuthContext = () => {
1183
+ if (options.authContext) return options.authContext;
1184
+ if (ctx.props && Object.keys(ctx.props).length > 0) return { props: ctx.props };
1185
+ };
990
1186
  const handleRequest = async () => {
991
1187
  return await transport.handleRequest(request);
992
1188
  };
1189
+ const authContext = buildAuthContext();
1190
+ if (!transport.started) await server.connect(transport);
993
1191
  try {
994
- let response;
995
- if (authContext) response = await runWithAuthContext(authContext, handleRequest);
996
- else response = await handleRequest();
997
- return response;
1192
+ if (authContext) return await runWithAuthContext(authContext, handleRequest);
1193
+ else return await handleRequest();
998
1194
  } catch (error) {
999
1195
  console.error("MCP handler error:", error);
1000
1196
  return new Response(JSON.stringify({
@@ -1011,6 +1207,17 @@ function experimental_createMcpHandler(server, options = {}) {
1011
1207
  }
1012
1208
  };
1013
1209
  }
1210
+ let didWarnAboutExperimentalCreateMcpHandler = false;
1211
+ /**
1212
+ * @deprecated This has been renamed to createMcpHandler, and experimental_createMcpHandler will be removed in the next major version
1213
+ */
1214
+ function experimental_createMcpHandler(server, options = {}) {
1215
+ if (!didWarnAboutExperimentalCreateMcpHandler) {
1216
+ didWarnAboutExperimentalCreateMcpHandler = true;
1217
+ console.warn("experimental_createMcpHandler is deprecated, use createMcpHandler instead. experimental_createMcpHandler will be removed in the next major version.");
1218
+ }
1219
+ return createMcpHandler(server, options);
1220
+ }
1014
1221
 
1015
1222
  //#endregion
1016
1223
  //#region src/mcp/index.ts
@@ -1051,7 +1258,7 @@ var McpAgent = class McpAgent extends Agent {
1051
1258
  /** Returns a new transport matching the type of the Agent. */
1052
1259
  initTransport() {
1053
1260
  switch (this.getTransportType()) {
1054
- case "sse": return new McpSSETransport(() => this.getWebSocket());
1261
+ case "sse": return new McpSSETransport();
1055
1262
  case "streamable-http": return new StreamableHTTPServerTransport({});
1056
1263
  }
1057
1264
  }
@@ -1104,7 +1311,7 @@ var McpAgent = class McpAgent extends Agent {
1104
1311
  }
1105
1312
  }
1106
1313
  /** Handles MCP Messages for the legacy SSE transport. */
1107
- async onSSEMcpMessage(_sessionId, messageBody) {
1314
+ async onSSEMcpMessage(_sessionId, messageBody, extraInfo) {
1108
1315
  if (this.getTransportType() !== "sse") return /* @__PURE__ */ new Error("Internal Server Error: Expected SSE transport");
1109
1316
  try {
1110
1317
  let parsedMessage;
@@ -1115,7 +1322,7 @@ var McpAgent = class McpAgent extends Agent {
1115
1322
  throw error;
1116
1323
  }
1117
1324
  if (await this._handleElicitationResponse(parsedMessage)) return null;
1118
- this._transport?.onmessage?.(parsedMessage);
1325
+ this._transport?.onmessage?.(parsedMessage, extraInfo);
1119
1326
  return null;
1120
1327
  } catch (error) {
1121
1328
  console.error("Error forwarding message to SSE:", error);
@@ -1201,7 +1408,7 @@ var McpAgent = class McpAgent extends Agent {
1201
1408
  /** Return a handler for the given path for this MCP.
1202
1409
  * Defaults to Streamable HTTP transport.
1203
1410
  */
1204
- static serve(path, { binding = "MCP_OBJECT", corsOptions, transport = "streamable-http" } = {}) {
1411
+ static serve(path, { binding = "MCP_OBJECT", corsOptions, transport = "streamable-http", jurisdiction } = {}) {
1205
1412
  return { async fetch(request, env, ctx) {
1206
1413
  const corsResponse = handleCORS(request, corsOptions);
1207
1414
  if (corsResponse) return corsResponse;
@@ -1210,8 +1417,14 @@ var McpAgent = class McpAgent extends Agent {
1210
1417
  if (!isDurableObjectNamespace(bindingValue)) throw new Error(`Invalid McpAgent binding for ${binding}. Make sure it's a Durable Object binding.`);
1211
1418
  const namespace = bindingValue;
1212
1419
  switch (transport) {
1213
- case "streamable-http": return createStreamingHttpHandler(path, namespace, corsOptions)(request, ctx);
1214
- case "sse": return createLegacySseHandler(path, namespace, corsOptions)(request, ctx);
1420
+ case "streamable-http": return createStreamingHttpHandler(path, namespace, {
1421
+ corsOptions,
1422
+ jurisdiction
1423
+ })(request, ctx);
1424
+ case "sse": return createLegacySseHandler(path, namespace, {
1425
+ corsOptions,
1426
+ jurisdiction
1427
+ })(request, ctx);
1215
1428
  default: return new Response("Invalid MCP transport mode. Only `streamable-http` or `sse` are allowed.", { status: 500 });
1216
1429
  }
1217
1430
  } };
@@ -1231,5 +1444,5 @@ var McpAgent = class McpAgent extends Agent {
1231
1444
  };
1232
1445
 
1233
1446
  //#endregion
1234
- export { ElicitRequestSchema, McpAgent, SSEEdgeClientTransport, StreamableHTTPEdgeClientTransport, WorkerTransport, experimental_createMcpHandler, getMcpAuthContext };
1447
+ export { ElicitRequestSchema, McpAgent, SSEEdgeClientTransport, StreamableHTTPEdgeClientTransport, WorkerTransport, createMcpHandler, experimental_createMcpHandler, getMcpAuthContext };
1235
1448
  //# sourceMappingURL=index.js.map