agents 0.0.78 → 0.0.80

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/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { Server, Connection, PartyServerOptions } from "partyserver";
2
2
  export { Connection, ConnectionContext, WSMessage } from "partyserver";
3
3
  import { MCPClientManager } from "./mcp/client.js";
4
+ import { Tool, Prompt, Resource } from "@modelcontextprotocol/sdk/types.js";
5
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4
6
  import "zod";
5
- import "@modelcontextprotocol/sdk/types.js";
6
- import "@modelcontextprotocol/sdk/client/index.js";
7
7
  import "@modelcontextprotocol/sdk/client/sse.js";
8
8
  import "./mcp/do-oauth-client-provider.js";
9
9
  import "@modelcontextprotocol/sdk/client/auth.js";
@@ -103,6 +103,27 @@ type Schedule<T = string> = {
103
103
  cron: string;
104
104
  }
105
105
  );
106
+ /**
107
+ * MCP Server state update message from server -> Client
108
+ */
109
+ type MCPServerMessage = {
110
+ type: "cf_agent_mcp_servers";
111
+ mcp: MCPServersState;
112
+ };
113
+ type MCPServersState = {
114
+ servers: {
115
+ [id: string]: MCPServer;
116
+ };
117
+ tools: Tool[];
118
+ prompts: Prompt[];
119
+ resources: Resource[];
120
+ };
121
+ type MCPServer = {
122
+ name: string;
123
+ server_url: string;
124
+ auth_url: string | null;
125
+ state: "authenticating" | "connecting" | "ready" | "discovering" | "failed";
126
+ };
106
127
  declare function getCurrentAgent<
107
128
  T extends Agent<unknown, unknown> = Agent<unknown, unknown>,
108
129
  >(): {
@@ -209,14 +230,43 @@ declare class Agent<Env, State = unknown> extends Server<Env> {
209
230
  */
210
231
  cancelSchedule(id: string): Promise<boolean>;
211
232
  /**
212
- * Method called when an alarm fires
213
- * Executes any scheduled tasks that are due
233
+ * Method called when an alarm fires.
234
+ * Executes any scheduled tasks that are due.
235
+ *
236
+ * @remarks
237
+ * To schedule a task, please use the `this.schedule` method instead.
238
+ * See {@link https://developers.cloudflare.com/agents/api-reference/schedule-tasks/}
214
239
  */
215
- alarm(): Promise<void>;
240
+ readonly alarm: () => Promise<void>;
216
241
  /**
217
242
  * Destroy the Agent, removing all state and scheduled tasks
218
243
  */
219
244
  destroy(): Promise<void>;
245
+ /**
246
+ * Connect to a new MCP Server
247
+ *
248
+ * @param url MCP Server SSE URL
249
+ * @param callbackHost Base host for the agent, used for the redirect URI.
250
+ * @param agentsPrefix agents routing prefix if not using `agents`
251
+ * @param options MCP client and transport (header) options
252
+ * @returns authUrl
253
+ */
254
+ addMcpServer(
255
+ serverName: string,
256
+ url: string,
257
+ callbackHost: string,
258
+ agentsPrefix?: string,
259
+ options?: {
260
+ client?: ConstructorParameters<typeof Client>[1];
261
+ transport?: {
262
+ headers: HeadersInit;
263
+ };
264
+ }
265
+ ): Promise<{
266
+ id: string;
267
+ authUrl: string | undefined;
268
+ }>;
269
+ removeMcpServer(id: string): Promise<void>;
220
270
  }
221
271
  /**
222
272
  * Namespace for creating Agent instances
@@ -301,6 +351,9 @@ export {
301
351
  type AgentNamespace,
302
352
  type AgentOptions,
303
353
  type CallableMetadata,
354
+ type MCPServer,
355
+ type MCPServerMessage,
356
+ type MCPServersState,
304
357
  type RPCRequest,
305
358
  type RPCResponse,
306
359
  type Schedule,
package/dist/index.js CHANGED
@@ -6,8 +6,10 @@ import {
6
6
  routeAgentEmail,
7
7
  routeAgentRequest,
8
8
  unstable_callable
9
- } from "./chunk-5W7ZWKOP.js";
10
- import "./chunk-Q5ZBHY4Z.js";
9
+ } from "./chunk-YFPCCSZO.js";
10
+ import "./chunk-D6UOOELW.js";
11
+ import "./chunk-RN4SNE73.js";
12
+ import "./chunk-25YDMV4H.js";
11
13
  import "./chunk-HMLY7DHA.js";
12
14
  export {
13
15
  Agent,
@@ -1,5 +1,5 @@
1
1
  import * as zod from 'zod';
2
- import { ClientCapabilities, Tool, Prompt, Resource, ResourceTemplate, ServerCapabilities, CallToolRequest, CallToolResultSchema, CompatibilityCallToolResultSchema, ReadResourceRequest, GetPromptRequest } from '@modelcontextprotocol/sdk/types.js';
2
+ import { Tool, Prompt, Resource, ResourceTemplate, ServerCapabilities, CallToolRequest, CallToolResultSchema, CompatibilityCallToolResultSchema, ReadResourceRequest, GetPromptRequest } from '@modelcontextprotocol/sdk/types.js';
3
3
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
4
  import { SSEClientTransportOptions } from '@modelcontextprotocol/sdk/client/sse.js';
5
5
  import { AgentsOAuthProvider } from './do-oauth-client-provider.js';
@@ -15,7 +15,6 @@ declare class MCPClientConnection {
15
15
  authProvider?: AgentsOAuthProvider;
16
16
  };
17
17
  client: ConstructorParameters<typeof Client>[1];
18
- capabilities: ClientCapabilities;
19
18
  };
20
19
  client: Client;
21
20
  connectionState: "authenticating" | "connecting" | "ready" | "discovering" | "failed";
@@ -30,7 +29,6 @@ declare class MCPClientConnection {
30
29
  authProvider?: AgentsOAuthProvider;
31
30
  };
32
31
  client: ConstructorParameters<typeof Client>[1];
33
- capabilities: ClientCapabilities;
34
32
  });
35
33
  /**
36
34
  * Initialize a client connection
@@ -38,7 +36,7 @@ declare class MCPClientConnection {
38
36
  * @param code Optional OAuth code to initialize the connection with if auth hasn't been initialized
39
37
  * @returns
40
38
  */
41
- init(code?: string, clientId?: string): Promise<void>;
39
+ init(code?: string): Promise<void>;
42
40
  /**
43
41
  * Notification handler registration
44
42
  */
@@ -57,13 +55,21 @@ declare class MCPClientConnection {
57
55
  } | undefined;
58
56
  };
59
57
  description?: string | undefined;
58
+ annotations?: {
59
+ [x: string]: unknown;
60
+ title?: string | undefined;
61
+ readOnlyHint?: boolean | undefined;
62
+ destructiveHint?: boolean | undefined;
63
+ idempotentHint?: boolean | undefined;
64
+ openWorldHint?: boolean | undefined;
65
+ } | undefined;
60
66
  }[]>;
61
67
  fetchResources(): Promise<{
62
68
  [x: string]: unknown;
63
- uri: string;
64
69
  name: string;
65
- mimeType?: string | undefined;
70
+ uri: string;
66
71
  description?: string | undefined;
72
+ mimeType?: string | undefined;
67
73
  }[]>;
68
74
  fetchPrompts(): Promise<{
69
75
  [x: string]: unknown;
@@ -80,8 +86,8 @@ declare class MCPClientConnection {
80
86
  [x: string]: unknown;
81
87
  name: string;
82
88
  uriTemplate: string;
83
- mimeType?: string | undefined;
84
89
  description?: string | undefined;
90
+ mimeType?: string | undefined;
85
91
  }[]>;
86
92
  }
87
93
 
@@ -116,10 +122,10 @@ declare class MCPClientManager {
116
122
  authProvider?: AgentsOAuthProvider;
117
123
  };
118
124
  client?: ConstructorParameters<typeof Client>[1];
119
- capabilities?: ClientCapabilities;
120
125
  }): Promise<{
121
126
  id: string;
122
- authUrl: string | undefined;
127
+ authUrl?: string;
128
+ clientId?: string;
123
129
  }>;
124
130
  isCallbackRequest(req: Request): boolean;
125
131
  handleCallbackRequest(req: Request): Promise<{
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MCPClientManager,
3
3
  getNamespacedData
4
- } from "../chunk-Q5ZBHY4Z.js";
4
+ } from "../chunk-25YDMV4H.js";
5
5
  import "../chunk-HMLY7DHA.js";
6
6
  export {
7
7
  MCPClientManager,
@@ -1,106 +1,7 @@
1
+ import {
2
+ DurableObjectOAuthClientProvider
3
+ } from "../chunk-D6UOOELW.js";
1
4
  import "../chunk-HMLY7DHA.js";
2
-
3
- // src/mcp/do-oauth-client-provider.ts
4
- var DurableObjectOAuthClientProvider = class {
5
- constructor(storage, clientName, baseRedirectUrl) {
6
- this.storage = storage;
7
- this.clientName = clientName;
8
- this.baseRedirectUrl = baseRedirectUrl;
9
- }
10
- get clientMetadata() {
11
- return {
12
- redirect_uris: [this.redirectUrl],
13
- token_endpoint_auth_method: "none",
14
- grant_types: ["authorization_code", "refresh_token"],
15
- response_types: ["code"],
16
- client_name: this.clientName,
17
- client_uri: "example.com"
18
- };
19
- }
20
- get redirectUrl() {
21
- return `${this.baseRedirectUrl}/${this.serverId}`;
22
- }
23
- get clientId() {
24
- if (!this.clientId_) {
25
- throw new Error("Trying to access clientId before it was set");
26
- }
27
- return this.clientId_;
28
- }
29
- set clientId(clientId_) {
30
- this.clientId_ = clientId_;
31
- }
32
- get serverId() {
33
- if (!this.serverId_) {
34
- throw new Error("Trying to access serverId before it was set");
35
- }
36
- return this.serverId_;
37
- }
38
- set serverId(serverId_) {
39
- this.serverId_ = serverId_;
40
- }
41
- keyPrefix(clientId) {
42
- return `/${this.clientName}/${this.serverId}/${clientId}`;
43
- }
44
- clientInfoKey(clientId) {
45
- return `${this.keyPrefix(clientId)}/client_info/`;
46
- }
47
- async clientInformation() {
48
- if (!this.clientId_) {
49
- return void 0;
50
- }
51
- return await this.storage.get(
52
- this.clientInfoKey(this.clientId)
53
- ) ?? void 0;
54
- }
55
- async saveClientInformation(clientInformation) {
56
- await this.storage.put(
57
- this.clientInfoKey(clientInformation.client_id),
58
- clientInformation
59
- );
60
- this.clientId = clientInformation.client_id;
61
- }
62
- tokenKey(clientId) {
63
- return `${this.keyPrefix(clientId)}/token`;
64
- }
65
- async tokens() {
66
- if (!this.clientId_) {
67
- return void 0;
68
- }
69
- return await this.storage.get(this.tokenKey(this.clientId)) ?? void 0;
70
- }
71
- async saveTokens(tokens) {
72
- await this.storage.put(this.tokenKey(this.clientId), tokens);
73
- }
74
- get authUrl() {
75
- return this.authUrl_;
76
- }
77
- /**
78
- * Because this operates on the server side (but we need browser auth), we send this url back to the user
79
- * and require user interact to initiate the redirect flow
80
- */
81
- async redirectToAuthorization(authUrl) {
82
- const client_id = authUrl.searchParams.get("client_id");
83
- if (client_id) {
84
- authUrl.searchParams.append("state", client_id);
85
- }
86
- this.authUrl_ = authUrl.toString();
87
- }
88
- codeVerifierKey(clientId) {
89
- return `${this.keyPrefix(clientId)}/code_verifier`;
90
- }
91
- async saveCodeVerifier(verifier) {
92
- await this.storage.put(this.codeVerifierKey(this.clientId), verifier);
93
- }
94
- async codeVerifier() {
95
- const codeVerifier = await this.storage.get(
96
- this.codeVerifierKey(this.clientId)
97
- );
98
- if (!codeVerifier) {
99
- throw new Error("No code verifier found");
100
- }
101
- return codeVerifier;
102
- }
103
- };
104
5
  export {
105
6
  DurableObjectOAuthClientProvider
106
7
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/do-oauth-client-provider.ts"],"sourcesContent":["import type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type {\n OAuthTokens,\n OAuthClientMetadata,\n OAuthClientInformation,\n OAuthClientInformationFull,\n} from \"@modelcontextprotocol/sdk/shared/auth.js\";\n\n// A slight extension to the standard OAuthClientProvider interface because `redirectToAuthorization` doesn't give us the interface we need\n// This allows us to track authentication for a specific server and associated dynamic client registration\nexport interface AgentsOAuthProvider extends OAuthClientProvider {\n authUrl: string | undefined;\n clientId: string | undefined;\n serverId: string | undefined;\n}\n\nexport class DurableObjectOAuthClientProvider implements AgentsOAuthProvider {\n private authUrl_: string | undefined;\n private serverId_: string | undefined;\n private clientId_: string | undefined;\n\n constructor(\n public storage: DurableObjectStorage,\n public clientName: string,\n public baseRedirectUrl: string\n ) {}\n\n get clientMetadata(): OAuthClientMetadata {\n return {\n redirect_uris: [this.redirectUrl],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n client_name: this.clientName,\n client_uri: \"example.com\",\n };\n }\n\n get redirectUrl() {\n return `${this.baseRedirectUrl}/${this.serverId}`;\n }\n\n get clientId() {\n if (!this.clientId_) {\n throw new Error(\"Trying to access clientId before it was set\");\n }\n return this.clientId_;\n }\n\n set clientId(clientId_: string) {\n this.clientId_ = clientId_;\n }\n\n get serverId() {\n if (!this.serverId_) {\n throw new Error(\"Trying to access serverId before it was set\");\n }\n return this.serverId_;\n }\n\n set serverId(serverId_: string) {\n this.serverId_ = serverId_;\n }\n\n keyPrefix(clientId: string) {\n return `/${this.clientName}/${this.serverId}/${clientId}`;\n }\n\n clientInfoKey(clientId: string) {\n return `${this.keyPrefix(clientId)}/client_info/`;\n }\n\n async clientInformation(): Promise<OAuthClientInformation | undefined> {\n if (!this.clientId_) {\n return undefined;\n }\n return (\n (await this.storage.get<OAuthClientInformation>(\n this.clientInfoKey(this.clientId)\n )) ?? undefined\n );\n }\n\n async saveClientInformation(\n clientInformation: OAuthClientInformationFull\n ): Promise<void> {\n await this.storage.put(\n this.clientInfoKey(clientInformation.client_id),\n clientInformation\n );\n this.clientId = clientInformation.client_id;\n }\n\n tokenKey(clientId: string) {\n return `${this.keyPrefix(clientId)}/token`;\n }\n\n async tokens(): Promise<OAuthTokens | undefined> {\n if (!this.clientId_) {\n return undefined;\n }\n return (\n (await this.storage.get<OAuthTokens>(this.tokenKey(this.clientId))) ??\n undefined\n );\n }\n\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n await this.storage.put(this.tokenKey(this.clientId), tokens);\n }\n\n get authUrl() {\n return this.authUrl_;\n }\n\n /**\n * Because this operates on the server side (but we need browser auth), we send this url back to the user\n * and require user interact to initiate the redirect flow\n */\n async redirectToAuthorization(authUrl: URL): Promise<void> {\n // We want to track the client ID in state here because the typescript SSE client sometimes does\n // a dynamic client registration AFTER generating this redirect URL.\n const client_id = authUrl.searchParams.get(\"client_id\");\n if (client_id) {\n authUrl.searchParams.append(\"state\", client_id);\n }\n this.authUrl_ = authUrl.toString();\n }\n\n codeVerifierKey(clientId: string) {\n return `${this.keyPrefix(clientId)}/code_verifier`;\n }\n\n async saveCodeVerifier(verifier: string): Promise<void> {\n await this.storage.put(this.codeVerifierKey(this.clientId), verifier);\n }\n\n async codeVerifier(): Promise<string> {\n const codeVerifier = await this.storage.get<string>(\n this.codeVerifierKey(this.clientId)\n );\n if (!codeVerifier) {\n throw new Error(\"No code verifier found\");\n }\n return codeVerifier;\n }\n}\n"],"mappings":";;;AAgBO,IAAM,mCAAN,MAAsE;AAAA,EAK3E,YACS,SACA,YACA,iBACP;AAHO;AACA;AACA;AAAA,EACN;AAAA,EAEH,IAAI,iBAAsC;AACxC,WAAO;AAAA,MACL,eAAe,CAAC,KAAK,WAAW;AAAA,MAChC,4BAA4B;AAAA,MAC5B,aAAa,CAAC,sBAAsB,eAAe;AAAA,MACnD,gBAAgB,CAAC,MAAM;AAAA,MACvB,aAAa,KAAK;AAAA,MAClB,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,GAAG,KAAK,eAAe,IAAI,KAAK,QAAQ;AAAA,EACjD;AAAA,EAEA,IAAI,WAAW;AACb,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAS,WAAmB;AAC9B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IAAI,WAAW;AACb,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAS,WAAmB;AAC9B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,UAAU,UAAkB;AAC1B,WAAO,IAAI,KAAK,UAAU,IAAI,KAAK,QAAQ,IAAI,QAAQ;AAAA,EACzD;AAAA,EAEA,cAAc,UAAkB;AAC9B,WAAO,GAAG,KAAK,UAAU,QAAQ,CAAC;AAAA,EACpC;AAAA,EAEA,MAAM,oBAAiE;AACrE,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO;AAAA,IACT;AACA,WACG,MAAM,KAAK,QAAQ;AAAA,MAClB,KAAK,cAAc,KAAK,QAAQ;AAAA,IAClC,KAAM;AAAA,EAEV;AAAA,EAEA,MAAM,sBACJ,mBACe;AACf,UAAM,KAAK,QAAQ;AAAA,MACjB,KAAK,cAAc,kBAAkB,SAAS;AAAA,MAC9C;AAAA,IACF;AACA,SAAK,WAAW,kBAAkB;AAAA,EACpC;AAAA,EAEA,SAAS,UAAkB;AACzB,WAAO,GAAG,KAAK,UAAU,QAAQ,CAAC;AAAA,EACpC;AAAA,EAEA,MAAM,SAA2C;AAC/C,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO;AAAA,IACT;AACA,WACG,MAAM,KAAK,QAAQ,IAAiB,KAAK,SAAS,KAAK,QAAQ,CAAC,KACjE;AAAA,EAEJ;AAAA,EAEA,MAAM,WAAW,QAAoC;AACnD,UAAM,KAAK,QAAQ,IAAI,KAAK,SAAS,KAAK,QAAQ,GAAG,MAAM;AAAA,EAC7D;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,wBAAwB,SAA6B;AAGzD,UAAM,YAAY,QAAQ,aAAa,IAAI,WAAW;AACtD,QAAI,WAAW;AACb,cAAQ,aAAa,OAAO,SAAS,SAAS;AAAA,IAChD;AACA,SAAK,WAAW,QAAQ,SAAS;AAAA,EACnC;AAAA,EAEA,gBAAgB,UAAkB;AAChC,WAAO,GAAG,KAAK,UAAU,QAAQ,CAAC;AAAA,EACpC;AAAA,EAEA,MAAM,iBAAiB,UAAiC;AACtD,UAAM,KAAK,QAAQ,IAAI,KAAK,gBAAgB,KAAK,QAAQ,GAAG,QAAQ;AAAA,EACtE;AAAA,EAEA,MAAM,eAAgC;AACpC,UAAM,eAAe,MAAM,KAAK,QAAQ;AAAA,MACtC,KAAK,gBAAgB,KAAK,QAAQ;AAAA,IACpC;AACA,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -18,6 +18,7 @@ interface CORSOptions {
18
18
  methods?: string;
19
19
  headers?: string;
20
20
  maxAge?: number;
21
+ exposeHeaders?: string;
21
22
  }
22
23
  type MaybePromise<T> = T | Promise<T>;
23
24
  declare abstract class McpAgent<Env = unknown, State = unknown, Props extends Record<string, unknown> = Record<string, unknown>> extends DurableObject<Env> {
package/dist/mcp/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import {
2
2
  Agent
3
- } from "../chunk-5W7ZWKOP.js";
4
- import "../chunk-Q5ZBHY4Z.js";
3
+ } from "../chunk-YFPCCSZO.js";
4
+ import "../chunk-D6UOOELW.js";
5
+ import "../chunk-RN4SNE73.js";
6
+ import "../chunk-25YDMV4H.js";
5
7
  import {
6
8
  __privateAdd,
7
9
  __privateGet,
@@ -20,16 +22,19 @@ import {
20
22
  JSONRPCMessageSchema
21
23
  } from "@modelcontextprotocol/sdk/types.js";
22
24
  var MAXIMUM_MESSAGE_SIZE_BYTES = 4 * 1024 * 1024;
23
- function handleCORS(request, corsOptions) {
24
- const origin = request.headers.get("Origin") || "*";
25
- const corsHeaders = {
26
- "Access-Control-Allow-Origin": corsOptions?.origin || origin,
27
- "Access-Control-Allow-Methods": corsOptions?.methods || "GET, POST, OPTIONS",
28
- "Access-Control-Allow-Headers": corsOptions?.headers || "Content-Type",
29
- "Access-Control-Max-Age": (corsOptions?.maxAge || 86400).toString()
25
+ function corsHeaders(request, corsOptions = {}) {
26
+ const origin = "*";
27
+ return {
28
+ "Access-Control-Allow-Origin": corsOptions.origin || origin,
29
+ "Access-Control-Allow-Methods": corsOptions.methods || "GET, POST, OPTIONS",
30
+ "Access-Control-Allow-Headers": corsOptions.headers || "Content-Type, mcp-session-id",
31
+ "Access-Control-Max-Age": (corsOptions.maxAge || 86400).toString(),
32
+ "Access-Control-Expose-Headers": corsOptions.exposeHeaders || "mcp-session-id"
30
33
  };
34
+ }
35
+ function handleCORS(request, corsOptions) {
31
36
  if (request.method === "OPTIONS") {
32
- return new Response(null, { headers: corsHeaders });
37
+ return new Response(null, { headers: corsHeaders(request, corsOptions) });
33
38
  }
34
39
  return null;
35
40
  }
@@ -460,7 +465,7 @@ data: ${JSON.stringify(result.data)}
460
465
  "Content-Type": "text/event-stream",
461
466
  "Cache-Control": "no-cache",
462
467
  Connection: "keep-alive",
463
- "Access-Control-Allow-Origin": corsOptions?.origin || "*"
468
+ ...corsHeaders(request, corsOptions)
464
469
  }
465
470
  });
466
471
  }
@@ -500,7 +505,7 @@ data: ${JSON.stringify(result.data)}
500
505
  "Content-Type": "text/event-stream",
501
506
  "Cache-Control": "no-cache",
502
507
  Connection: "keep-alive",
503
- "Access-Control-Allow-Origin": corsOptions?.origin || "*"
508
+ ...corsHeaders(request, corsOptions)
504
509
  }
505
510
  });
506
511
  }
@@ -510,7 +515,7 @@ data: ${JSON.stringify(result.data)}
510
515
  "Content-Type": "text/event-stream",
511
516
  "Cache-Control": "no-cache",
512
517
  Connection: "keep-alive",
513
- "Access-Control-Allow-Origin": corsOptions?.origin || "*"
518
+ ...corsHeaders(request, corsOptions)
514
519
  }
515
520
  });
516
521
  }
@@ -758,7 +763,10 @@ data: ${JSON.stringify(result.data)}
758
763
  ws.send(JSON.stringify(message));
759
764
  }
760
765
  ws.close();
761
- return new Response(null, { status: 202 });
766
+ return new Response(null, {
767
+ status: 202,
768
+ headers: corsHeaders(request, corsOptions)
769
+ });
762
770
  }
763
771
  for (const message of messages) {
764
772
  if (isJSONRPCRequest(message)) {
@@ -772,7 +780,7 @@ data: ${JSON.stringify(result.data)}
772
780
  "Cache-Control": "no-cache",
773
781
  Connection: "keep-alive",
774
782
  "mcp-session-id": sessionId,
775
- "Access-Control-Allow-Origin": corsOptions?.origin || "*"
783
+ ...corsHeaders(request, corsOptions)
776
784
  },
777
785
  status: 200
778
786
  });