agents 0.0.0-e4a2352 → 0.0.0-e777fdd
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 +129 -7
- package/dist/_esm-LV5FJ3HK.js +3922 -0
- package/dist/_esm-LV5FJ3HK.js.map +1 -0
- package/dist/ai-chat-agent.d.ts +9 -8
- package/dist/ai-chat-agent.js +151 -59
- package/dist/ai-chat-agent.js.map +1 -1
- package/dist/ai-chat-v5-migration.d.ts +152 -0
- package/dist/ai-chat-v5-migration.js +20 -0
- package/dist/ai-chat-v5-migration.js.map +1 -0
- package/dist/ai-react.d.ts +65 -70
- package/dist/ai-react.js +252 -99
- package/dist/ai-react.js.map +1 -1
- package/dist/ai-types.d.ts +37 -19
- package/dist/ai-types.js +7 -0
- package/dist/ccip-CMBYN64O.js +15 -0
- package/dist/ccip-CMBYN64O.js.map +1 -0
- package/dist/chunk-5Y6BEZDY.js +276 -0
- package/dist/chunk-5Y6BEZDY.js.map +1 -0
- package/dist/chunk-BER7KXUJ.js +18 -0
- package/dist/chunk-BER7KXUJ.js.map +1 -0
- package/dist/chunk-JJBFIGUC.js +5202 -0
- package/dist/chunk-JJBFIGUC.js.map +1 -0
- package/dist/chunk-PR4QN5HX.js +43 -0
- package/dist/chunk-PR4QN5HX.js.map +1 -0
- package/dist/{chunk-HY7ZLHJB.js → chunk-QEPGNUG6.js} +71 -19
- package/dist/chunk-QEPGNUG6.js.map +1 -0
- package/dist/{chunk-KUH345EY.js → chunk-QEVM4BVL.js} +5 -5
- package/dist/chunk-QEVM4BVL.js.map +1 -0
- package/dist/{chunk-JXN5WZFQ.js → chunk-RS5OCNEQ.js} +117 -81
- package/dist/chunk-RS5OCNEQ.js.map +1 -0
- package/dist/chunk-TYAY6AU6.js +159 -0
- package/dist/chunk-TYAY6AU6.js.map +1 -0
- package/dist/chunk-UJVEAURM.js +150 -0
- package/dist/chunk-UJVEAURM.js.map +1 -0
- package/dist/{chunk-PVQZBKN7.js → chunk-XFS5ERG3.js} +24 -3
- package/dist/chunk-XFS5ERG3.js.map +1 -0
- package/dist/{client-DgyzBU_8.d.ts → client-BohGLma8.d.ts} +461 -21
- package/dist/client.js +3 -1
- package/dist/index.d.ts +562 -32
- package/dist/index.js +8 -4
- package/dist/mcp/client.d.ts +1 -1
- package/dist/mcp/client.js +2 -1
- package/dist/mcp/do-oauth-client-provider.d.ts +9 -0
- package/dist/mcp/do-oauth-client-provider.js +2 -1
- package/dist/mcp/index.d.ts +49 -73
- package/dist/mcp/index.js +906 -721
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/x402.d.ts +39 -0
- package/dist/mcp/x402.js +3195 -0
- package/dist/mcp/x402.js.map +1 -0
- package/dist/observability/index.d.ts +46 -14
- package/dist/observability/index.js +6 -4
- package/dist/react.d.ts +4 -2
- package/dist/react.js +8 -5
- package/dist/react.js.map +1 -1
- package/dist/schedule.d.ts +79 -5
- package/dist/schedule.js +17 -2
- package/dist/schedule.js.map +1 -1
- package/dist/secp256k1-M22GZP2U.js +2193 -0
- package/dist/secp256k1-M22GZP2U.js.map +1 -0
- package/package.json +24 -8
- package/src/index.ts +164 -94
- package/dist/chunk-HY7ZLHJB.js.map +0 -1
- package/dist/chunk-JXN5WZFQ.js.map +0 -1
- package/dist/chunk-KUH345EY.js.map +0 -1
- package/dist/chunk-PVQZBKN7.js.map +0 -1
- package/dist/index-BCJclX6q.d.ts +0 -615
package/src/index.ts
CHANGED
|
@@ -23,9 +23,10 @@ import {
|
|
|
23
23
|
} from "partyserver";
|
|
24
24
|
import { camelCaseToKebabCase } from "./client";
|
|
25
25
|
import { MCPClientManager } from "./mcp/client";
|
|
26
|
-
// import type { MCPClientConnection } from "./mcp/client-connection";
|
|
27
26
|
import { DurableObjectOAuthClientProvider } from "./mcp/do-oauth-client-provider";
|
|
27
|
+
import type { TransportType } from "./mcp/types";
|
|
28
28
|
import { genericObservability, type Observability } from "./observability";
|
|
29
|
+
import { MessageType } from "./ai-types";
|
|
29
30
|
|
|
30
31
|
export type { Connection, ConnectionContext, WSMessage } from "partyserver";
|
|
31
32
|
|
|
@@ -43,7 +44,7 @@ export type RPCRequest = {
|
|
|
43
44
|
* State update message from client
|
|
44
45
|
*/
|
|
45
46
|
export type StateUpdateMessage = {
|
|
46
|
-
type:
|
|
47
|
+
type: MessageType.CF_AGENT_STATE;
|
|
47
48
|
state: unknown;
|
|
48
49
|
};
|
|
49
50
|
|
|
@@ -51,7 +52,7 @@ export type StateUpdateMessage = {
|
|
|
51
52
|
* RPC response message to client
|
|
52
53
|
*/
|
|
53
54
|
export type RPCResponse = {
|
|
54
|
-
type:
|
|
55
|
+
type: MessageType.RPC;
|
|
55
56
|
id: string;
|
|
56
57
|
} & (
|
|
57
58
|
| {
|
|
@@ -78,7 +79,7 @@ function isRPCRequest(msg: unknown): msg is RPCRequest {
|
|
|
78
79
|
typeof msg === "object" &&
|
|
79
80
|
msg !== null &&
|
|
80
81
|
"type" in msg &&
|
|
81
|
-
msg.type ===
|
|
82
|
+
msg.type === MessageType.RPC &&
|
|
82
83
|
"id" in msg &&
|
|
83
84
|
typeof msg.id === "string" &&
|
|
84
85
|
"method" in msg &&
|
|
@@ -96,7 +97,7 @@ function isStateUpdateMessage(msg: unknown): msg is StateUpdateMessage {
|
|
|
96
97
|
typeof msg === "object" &&
|
|
97
98
|
msg !== null &&
|
|
98
99
|
"type" in msg &&
|
|
99
|
-
msg.type ===
|
|
100
|
+
msg.type === MessageType.CF_AGENT_STATE &&
|
|
100
101
|
"state" in msg
|
|
101
102
|
);
|
|
102
103
|
}
|
|
@@ -117,7 +118,7 @@ const callableMetadata = new Map<Function, CallableMetadata>();
|
|
|
117
118
|
* Decorator that marks a method as callable by clients
|
|
118
119
|
* @param metadata Optional metadata about the callable method
|
|
119
120
|
*/
|
|
120
|
-
export function
|
|
121
|
+
export function callable(metadata: CallableMetadata = {}) {
|
|
121
122
|
return function callableDecorator<This, Args extends unknown[], Return>(
|
|
122
123
|
target: (this: This, ...args: Args) => Return,
|
|
123
124
|
// biome-ignore lint/correctness/noUnusedFunctionParameters: later
|
|
@@ -131,6 +132,23 @@ export function unstable_callable(metadata: CallableMetadata = {}) {
|
|
|
131
132
|
};
|
|
132
133
|
}
|
|
133
134
|
|
|
135
|
+
let didWarnAboutUnstableCallable = false;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Decorator that marks a method as callable by clients
|
|
139
|
+
* @deprecated this has been renamed to callable, and unstable_callable will be removed in the next major version
|
|
140
|
+
* @param metadata Optional metadata about the callable method
|
|
141
|
+
*/
|
|
142
|
+
export const unstable_callable = (metadata: CallableMetadata = {}) => {
|
|
143
|
+
if (!didWarnAboutUnstableCallable) {
|
|
144
|
+
didWarnAboutUnstableCallable = true;
|
|
145
|
+
console.warn(
|
|
146
|
+
"unstable_callable is deprecated, use callable instead. unstable_callable will be removed in the next major version."
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
callable(metadata);
|
|
150
|
+
};
|
|
151
|
+
|
|
134
152
|
export type QueueItem<T = string> = {
|
|
135
153
|
id: string;
|
|
136
154
|
payload: T;
|
|
@@ -179,11 +197,13 @@ function getNextCronTime(cron: string) {
|
|
|
179
197
|
return interval.getNextDate();
|
|
180
198
|
}
|
|
181
199
|
|
|
200
|
+
export type { TransportType } from "./mcp/types";
|
|
201
|
+
|
|
182
202
|
/**
|
|
183
203
|
* MCP Server state update message from server -> Client
|
|
184
204
|
*/
|
|
185
205
|
export type MCPServerMessage = {
|
|
186
|
-
type:
|
|
206
|
+
type: MessageType.CF_AGENT_MCP_SERVERS;
|
|
187
207
|
mcp: MCPServersState;
|
|
188
208
|
};
|
|
189
209
|
|
|
@@ -272,7 +292,13 @@ function withAgentContext<T extends (...args: any[]) => any>(
|
|
|
272
292
|
method: T
|
|
273
293
|
): (this: Agent<unknown, unknown>, ...args: Parameters<T>) => ReturnType<T> {
|
|
274
294
|
return function (...args: Parameters<T>): ReturnType<T> {
|
|
275
|
-
const { connection, request, email } = getCurrentAgent();
|
|
295
|
+
const { connection, request, email, agent } = getCurrentAgent();
|
|
296
|
+
|
|
297
|
+
if (agent === this) {
|
|
298
|
+
// already wrapped, so we can just call the method
|
|
299
|
+
return method.apply(this, args);
|
|
300
|
+
}
|
|
301
|
+
// not wrapped, so we need to wrap it
|
|
276
302
|
return agentContext.run({ agent: this, connection, request, email }, () => {
|
|
277
303
|
return method.apply(this, args);
|
|
278
304
|
});
|
|
@@ -284,13 +310,20 @@ function withAgentContext<T extends (...args: any[]) => any>(
|
|
|
284
310
|
* @template Env Environment type containing bindings
|
|
285
311
|
* @template State State type to store within the Agent
|
|
286
312
|
*/
|
|
287
|
-
export class Agent<
|
|
313
|
+
export class Agent<
|
|
314
|
+
Env = typeof env,
|
|
315
|
+
State = unknown,
|
|
316
|
+
Props extends Record<string, unknown> = Record<string, unknown>
|
|
317
|
+
> extends Server<Env, Props> {
|
|
288
318
|
private _state = DEFAULT_STATE as State;
|
|
289
319
|
|
|
290
320
|
private _ParentClass: typeof Agent<Env, State> =
|
|
291
321
|
Object.getPrototypeOf(this).constructor;
|
|
292
322
|
|
|
293
|
-
mcp: MCPClientManager = new MCPClientManager(
|
|
323
|
+
readonly mcp: MCPClientManager = new MCPClientManager(
|
|
324
|
+
this._ParentClass.name,
|
|
325
|
+
"0.0.1"
|
|
326
|
+
);
|
|
294
327
|
|
|
295
328
|
/**
|
|
296
329
|
* Initial state for the Agent
|
|
@@ -383,8 +416,11 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
383
416
|
constructor(ctx: AgentContext, env: Env) {
|
|
384
417
|
super(ctx, env);
|
|
385
418
|
|
|
386
|
-
|
|
387
|
-
|
|
419
|
+
if (!wrappedClasses.has(this.constructor)) {
|
|
420
|
+
// Auto-wrap custom methods with agent context
|
|
421
|
+
this._autoWrapCustomMethods();
|
|
422
|
+
wrappedClasses.add(this.constructor);
|
|
423
|
+
}
|
|
388
424
|
|
|
389
425
|
this.sql`
|
|
390
426
|
CREATE TABLE IF NOT EXISTS cf_agents_state (
|
|
@@ -447,7 +483,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
447
483
|
this.broadcast(
|
|
448
484
|
JSON.stringify({
|
|
449
485
|
mcp: this.getMcpServers(),
|
|
450
|
-
type:
|
|
486
|
+
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
451
487
|
})
|
|
452
488
|
);
|
|
453
489
|
|
|
@@ -516,10 +552,8 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
516
552
|
displayMessage: `RPC call to ${method}`,
|
|
517
553
|
id: nanoid(),
|
|
518
554
|
payload: {
|
|
519
|
-
args,
|
|
520
555
|
method,
|
|
521
|
-
streaming: metadata?.streaming
|
|
522
|
-
success: true
|
|
556
|
+
streaming: metadata?.streaming
|
|
523
557
|
},
|
|
524
558
|
timestamp: Date.now(),
|
|
525
559
|
type: "rpc"
|
|
@@ -532,7 +566,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
532
566
|
id,
|
|
533
567
|
result,
|
|
534
568
|
success: true,
|
|
535
|
-
type:
|
|
569
|
+
type: MessageType.RPC
|
|
536
570
|
};
|
|
537
571
|
connection.send(JSON.stringify(response));
|
|
538
572
|
} catch (e) {
|
|
@@ -542,7 +576,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
542
576
|
e instanceof Error ? e.message : "Unknown error occurred",
|
|
543
577
|
id: parsed.id,
|
|
544
578
|
success: false,
|
|
545
|
-
type:
|
|
579
|
+
type: MessageType.RPC
|
|
546
580
|
};
|
|
547
581
|
connection.send(JSON.stringify(response));
|
|
548
582
|
console.error("RPC error:", e);
|
|
@@ -561,44 +595,42 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
561
595
|
// must fix this
|
|
562
596
|
return agentContext.run(
|
|
563
597
|
{ agent: this, connection, request: ctx.request, email: undefined },
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
if (this.state) {
|
|
567
|
-
connection.send(
|
|
568
|
-
JSON.stringify({
|
|
569
|
-
state: this.state,
|
|
570
|
-
type: "cf_agent_state"
|
|
571
|
-
})
|
|
572
|
-
);
|
|
573
|
-
}
|
|
574
|
-
|
|
598
|
+
() => {
|
|
599
|
+
if (this.state) {
|
|
575
600
|
connection.send(
|
|
576
601
|
JSON.stringify({
|
|
577
|
-
|
|
578
|
-
type:
|
|
602
|
+
state: this.state,
|
|
603
|
+
type: MessageType.CF_AGENT_STATE
|
|
579
604
|
})
|
|
580
605
|
);
|
|
606
|
+
}
|
|
581
607
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
608
|
+
connection.send(
|
|
609
|
+
JSON.stringify({
|
|
610
|
+
mcp: this.getMcpServers(),
|
|
611
|
+
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
612
|
+
})
|
|
613
|
+
);
|
|
614
|
+
|
|
615
|
+
this.observability?.emit(
|
|
616
|
+
{
|
|
617
|
+
displayMessage: "Connection established",
|
|
618
|
+
id: nanoid(),
|
|
619
|
+
payload: {
|
|
620
|
+
connectionId: connection.id
|
|
591
621
|
},
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
622
|
+
timestamp: Date.now(),
|
|
623
|
+
type: "connect"
|
|
624
|
+
},
|
|
625
|
+
this.ctx
|
|
626
|
+
);
|
|
627
|
+
return this._tryCatch(() => _onConnect(connection, ctx));
|
|
596
628
|
}
|
|
597
629
|
);
|
|
598
630
|
};
|
|
599
631
|
|
|
600
632
|
const _onStart = this.onStart.bind(this);
|
|
601
|
-
this.onStart = async () => {
|
|
633
|
+
this.onStart = async (props?: Props) => {
|
|
602
634
|
return agentContext.run(
|
|
603
635
|
{
|
|
604
636
|
agent: this,
|
|
@@ -615,12 +647,19 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
615
647
|
this.broadcast(
|
|
616
648
|
JSON.stringify({
|
|
617
649
|
mcp: this.getMcpServers(),
|
|
618
|
-
type:
|
|
650
|
+
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
619
651
|
})
|
|
620
652
|
);
|
|
621
653
|
|
|
622
654
|
// from DO storage, reconnect to all servers not currently in the oauth flow using our saved auth information
|
|
623
655
|
if (servers && Array.isArray(servers) && servers.length > 0) {
|
|
656
|
+
// Restore callback URLs for OAuth-enabled servers
|
|
657
|
+
servers.forEach((server) => {
|
|
658
|
+
if (server.callback_url) {
|
|
659
|
+
this.mcp.registerCallbackUrl(server.callback_url);
|
|
660
|
+
}
|
|
661
|
+
});
|
|
662
|
+
|
|
624
663
|
servers.forEach((server) => {
|
|
625
664
|
this._connectToMcpServerInternal(
|
|
626
665
|
server.name,
|
|
@@ -639,7 +678,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
639
678
|
this.broadcast(
|
|
640
679
|
JSON.stringify({
|
|
641
680
|
mcp: this.getMcpServers(),
|
|
642
|
-
type:
|
|
681
|
+
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
643
682
|
})
|
|
644
683
|
);
|
|
645
684
|
})
|
|
@@ -652,13 +691,13 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
652
691
|
this.broadcast(
|
|
653
692
|
JSON.stringify({
|
|
654
693
|
mcp: this.getMcpServers(),
|
|
655
|
-
type:
|
|
694
|
+
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
656
695
|
})
|
|
657
696
|
);
|
|
658
697
|
});
|
|
659
698
|
});
|
|
660
699
|
}
|
|
661
|
-
return _onStart();
|
|
700
|
+
return _onStart(props);
|
|
662
701
|
});
|
|
663
702
|
}
|
|
664
703
|
);
|
|
@@ -669,7 +708,6 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
669
708
|
state: State,
|
|
670
709
|
source: Connection | "server" = "server"
|
|
671
710
|
) {
|
|
672
|
-
const previousState = this._state;
|
|
673
711
|
this._state = state;
|
|
674
712
|
this.sql`
|
|
675
713
|
INSERT OR REPLACE INTO cf_agents_state (id, state)
|
|
@@ -682,7 +720,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
682
720
|
this.broadcast(
|
|
683
721
|
JSON.stringify({
|
|
684
722
|
state: state,
|
|
685
|
-
type:
|
|
723
|
+
type: MessageType.CF_AGENT_STATE
|
|
686
724
|
}),
|
|
687
725
|
source !== "server" ? [source.id] : []
|
|
688
726
|
);
|
|
@@ -695,10 +733,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
695
733
|
{
|
|
696
734
|
displayMessage: "State updated",
|
|
697
735
|
id: nanoid(),
|
|
698
|
-
payload: {
|
|
699
|
-
previousState,
|
|
700
|
-
state
|
|
701
|
-
},
|
|
736
|
+
payload: {},
|
|
702
737
|
timestamp: Date.now(),
|
|
703
738
|
type: "state:update"
|
|
704
739
|
},
|
|
@@ -838,41 +873,37 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
838
873
|
while (proto && proto !== Object.prototype && depth < 10) {
|
|
839
874
|
const methodNames = Object.getOwnPropertyNames(proto);
|
|
840
875
|
for (const methodName of methodNames) {
|
|
841
|
-
|
|
876
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, methodName);
|
|
877
|
+
|
|
878
|
+
// Skip if it's a private method, a base method, a getter, or not a function,
|
|
842
879
|
if (
|
|
843
880
|
baseMethods.has(methodName) ||
|
|
844
881
|
methodName.startsWith("_") ||
|
|
845
|
-
|
|
882
|
+
!descriptor ||
|
|
883
|
+
!!descriptor.get ||
|
|
884
|
+
typeof descriptor.value !== "function"
|
|
846
885
|
) {
|
|
847
886
|
continue;
|
|
848
887
|
}
|
|
849
|
-
// If the method doesn't exist in base prototypes, it's a custom method
|
|
850
|
-
if (!baseMethods.has(methodName)) {
|
|
851
|
-
const descriptor = Object.getOwnPropertyDescriptor(proto, methodName);
|
|
852
|
-
if (descriptor && typeof descriptor.value === "function") {
|
|
853
|
-
// Wrap the custom method with context
|
|
854
|
-
|
|
855
|
-
const wrappedFunction = withAgentContext(
|
|
856
|
-
// biome-ignore lint/suspicious/noExplicitAny: I can't typescript
|
|
857
|
-
this[methodName as keyof this] as (...args: any[]) => any
|
|
858
|
-
// biome-ignore lint/suspicious/noExplicitAny: I can't typescript
|
|
859
|
-
) as any;
|
|
860
|
-
|
|
861
|
-
// if the method is callable, copy the metadata from the original method
|
|
862
|
-
if (this._isCallable(methodName)) {
|
|
863
|
-
callableMetadata.set(
|
|
864
|
-
wrappedFunction,
|
|
865
|
-
callableMetadata.get(
|
|
866
|
-
this[methodName as keyof this] as Function
|
|
867
|
-
)!
|
|
868
|
-
);
|
|
869
|
-
}
|
|
870
888
|
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
889
|
+
// Now, methodName is confirmed to be a custom method/function
|
|
890
|
+
// Wrap the custom method with context
|
|
891
|
+
const wrappedFunction = withAgentContext(
|
|
892
|
+
// biome-ignore lint/suspicious/noExplicitAny: I can't typescript
|
|
893
|
+
this[methodName as keyof this] as (...args: any[]) => any
|
|
894
|
+
// biome-ignore lint/suspicious/noExplicitAny: I can't typescript
|
|
895
|
+
) as any;
|
|
896
|
+
|
|
897
|
+
// if the method is callable, copy the metadata from the original method
|
|
898
|
+
if (this._isCallable(methodName)) {
|
|
899
|
+
callableMetadata.set(
|
|
900
|
+
wrappedFunction,
|
|
901
|
+
callableMetadata.get(this[methodName as keyof this] as Function)!
|
|
902
|
+
);
|
|
875
903
|
}
|
|
904
|
+
|
|
905
|
+
// set the wrapped function on the prototype
|
|
906
|
+
this.constructor.prototype[methodName as keyof this] = wrappedFunction;
|
|
876
907
|
}
|
|
877
908
|
|
|
878
909
|
proto = Object.getPrototypeOf(proto);
|
|
@@ -1059,7 +1090,10 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1059
1090
|
{
|
|
1060
1091
|
displayMessage: `Schedule ${schedule.id} created`,
|
|
1061
1092
|
id: nanoid(),
|
|
1062
|
-
payload:
|
|
1093
|
+
payload: {
|
|
1094
|
+
callback: callback as string,
|
|
1095
|
+
id: id
|
|
1096
|
+
},
|
|
1063
1097
|
timestamp: Date.now(),
|
|
1064
1098
|
type: "schedule:create"
|
|
1065
1099
|
},
|
|
@@ -1229,7 +1263,10 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1229
1263
|
{
|
|
1230
1264
|
displayMessage: `Schedule ${id} cancelled`,
|
|
1231
1265
|
id: nanoid(),
|
|
1232
|
-
payload:
|
|
1266
|
+
payload: {
|
|
1267
|
+
callback: schedule.callback,
|
|
1268
|
+
id: schedule.id
|
|
1269
|
+
},
|
|
1233
1270
|
timestamp: Date.now(),
|
|
1234
1271
|
type: "schedule:cancel"
|
|
1235
1272
|
},
|
|
@@ -1294,7 +1331,10 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1294
1331
|
{
|
|
1295
1332
|
displayMessage: `Schedule ${row.id} executed`,
|
|
1296
1333
|
id: nanoid(),
|
|
1297
|
-
payload:
|
|
1334
|
+
payload: {
|
|
1335
|
+
callback: row.callback,
|
|
1336
|
+
id: row.id
|
|
1337
|
+
},
|
|
1298
1338
|
timestamp: Date.now(),
|
|
1299
1339
|
type: "schedule:execute"
|
|
1300
1340
|
},
|
|
@@ -1371,8 +1411,9 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1371
1411
|
/**
|
|
1372
1412
|
* Connect to a new MCP Server
|
|
1373
1413
|
*
|
|
1414
|
+
* @param serverName Name of the MCP server
|
|
1374
1415
|
* @param url MCP Server SSE URL
|
|
1375
|
-
* @param callbackHost Base host for the agent, used for the redirect URI.
|
|
1416
|
+
* @param callbackHost Base host for the agent, used for the redirect URI. If not provided, will be derived from the current request.
|
|
1376
1417
|
* @param agentsPrefix agents routing prefix if not using `agents`
|
|
1377
1418
|
* @param options MCP client and transport (header) options
|
|
1378
1419
|
* @returns authUrl
|
|
@@ -1380,7 +1421,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1380
1421
|
async addMcpServer(
|
|
1381
1422
|
serverName: string,
|
|
1382
1423
|
url: string,
|
|
1383
|
-
callbackHost
|
|
1424
|
+
callbackHost?: string,
|
|
1384
1425
|
agentsPrefix = "agents",
|
|
1385
1426
|
options?: {
|
|
1386
1427
|
client?: ConstructorParameters<typeof Client>[1];
|
|
@@ -1389,7 +1430,22 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1389
1430
|
};
|
|
1390
1431
|
}
|
|
1391
1432
|
): Promise<{ id: string; authUrl: string | undefined }> {
|
|
1392
|
-
|
|
1433
|
+
// If callbackHost is not provided, derive it from the current request
|
|
1434
|
+
let resolvedCallbackHost = callbackHost;
|
|
1435
|
+
if (!resolvedCallbackHost) {
|
|
1436
|
+
const { request } = getCurrentAgent();
|
|
1437
|
+
if (!request) {
|
|
1438
|
+
throw new Error(
|
|
1439
|
+
"callbackHost is required when not called within a request context"
|
|
1440
|
+
);
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
// Extract the origin from the request
|
|
1444
|
+
const requestUrl = new URL(request.url);
|
|
1445
|
+
resolvedCallbackHost = `${requestUrl.protocol}//${requestUrl.host}`;
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
const callbackUrl = `${resolvedCallbackHost}/${agentsPrefix}/${camelCaseToKebabCase(this._ParentClass.name)}/${this.name}/callback`;
|
|
1393
1449
|
|
|
1394
1450
|
const result = await this._connectToMcpServerInternal(
|
|
1395
1451
|
serverName,
|
|
@@ -1414,7 +1470,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1414
1470
|
this.broadcast(
|
|
1415
1471
|
JSON.stringify({
|
|
1416
1472
|
mcp: this.getMcpServers(),
|
|
1417
|
-
type:
|
|
1473
|
+
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
1418
1474
|
})
|
|
1419
1475
|
);
|
|
1420
1476
|
|
|
@@ -1437,6 +1493,7 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1437
1493
|
*/
|
|
1438
1494
|
transport?: {
|
|
1439
1495
|
headers?: HeadersInit;
|
|
1496
|
+
type?: TransportType;
|
|
1440
1497
|
};
|
|
1441
1498
|
},
|
|
1442
1499
|
reconnect?: {
|
|
@@ -1479,12 +1536,16 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1479
1536
|
};
|
|
1480
1537
|
}
|
|
1481
1538
|
|
|
1539
|
+
// Use the transport type specified in options, or default to "auto"
|
|
1540
|
+
const transportType = options?.transport?.type || "auto";
|
|
1541
|
+
|
|
1482
1542
|
const { id, authUrl, clientId } = await this.mcp.connect(url, {
|
|
1483
1543
|
client: options?.client,
|
|
1484
1544
|
reconnect,
|
|
1485
1545
|
transport: {
|
|
1486
1546
|
...headerTransportOpts,
|
|
1487
|
-
authProvider
|
|
1547
|
+
authProvider,
|
|
1548
|
+
type: transportType
|
|
1488
1549
|
}
|
|
1489
1550
|
});
|
|
1490
1551
|
|
|
@@ -1497,13 +1558,14 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1497
1558
|
|
|
1498
1559
|
async removeMcpServer(id: string) {
|
|
1499
1560
|
this.mcp.closeConnection(id);
|
|
1561
|
+
this.mcp.unregisterCallbackUrl(id);
|
|
1500
1562
|
this.sql`
|
|
1501
1563
|
DELETE FROM cf_agents_mcp_servers WHERE id = ${id};
|
|
1502
1564
|
`;
|
|
1503
1565
|
this.broadcast(
|
|
1504
1566
|
JSON.stringify({
|
|
1505
1567
|
mcp: this.getMcpServers(),
|
|
1506
|
-
type:
|
|
1568
|
+
type: MessageType.CF_AGENT_MCP_SERVERS
|
|
1507
1569
|
})
|
|
1508
1570
|
);
|
|
1509
1571
|
}
|
|
@@ -1539,6 +1601,9 @@ export class Agent<Env = typeof env, State = unknown> extends Server<Env> {
|
|
|
1539
1601
|
}
|
|
1540
1602
|
}
|
|
1541
1603
|
|
|
1604
|
+
// A set of classes that have been wrapped with agent context
|
|
1605
|
+
const wrappedClasses = new Set<typeof Agent.prototype.constructor>();
|
|
1606
|
+
|
|
1542
1607
|
/**
|
|
1543
1608
|
* Namespace for creating Agent instances
|
|
1544
1609
|
* @template Agentic Type of the Agent class
|
|
@@ -1854,12 +1919,17 @@ export type EmailSendOptions = {
|
|
|
1854
1919
|
* @param options Options for Agent creation
|
|
1855
1920
|
* @returns Promise resolving to an Agent instance stub
|
|
1856
1921
|
*/
|
|
1857
|
-
export async function getAgentByName<
|
|
1922
|
+
export async function getAgentByName<
|
|
1923
|
+
Env,
|
|
1924
|
+
T extends Agent<Env>,
|
|
1925
|
+
Props extends Record<string, unknown> = Record<string, unknown>
|
|
1926
|
+
>(
|
|
1858
1927
|
namespace: AgentNamespace<T>,
|
|
1859
1928
|
name: string,
|
|
1860
1929
|
options?: {
|
|
1861
1930
|
jurisdiction?: DurableObjectJurisdiction;
|
|
1862
1931
|
locationHint?: DurableObjectLocationHint;
|
|
1932
|
+
props?: Props;
|
|
1863
1933
|
}
|
|
1864
1934
|
) {
|
|
1865
1935
|
return getServerByName<Env, T>(namespace, name, options);
|
|
@@ -1891,7 +1961,7 @@ export class StreamingResponse {
|
|
|
1891
1961
|
id: this._id,
|
|
1892
1962
|
result: chunk,
|
|
1893
1963
|
success: true,
|
|
1894
|
-
type:
|
|
1964
|
+
type: MessageType.RPC
|
|
1895
1965
|
};
|
|
1896
1966
|
this._connection.send(JSON.stringify(response));
|
|
1897
1967
|
}
|
|
@@ -1910,7 +1980,7 @@ export class StreamingResponse {
|
|
|
1910
1980
|
id: this._id,
|
|
1911
1981
|
result: finalChunk,
|
|
1912
1982
|
success: true,
|
|
1913
|
-
type:
|
|
1983
|
+
type: MessageType.RPC
|
|
1914
1984
|
};
|
|
1915
1985
|
this._connection.send(JSON.stringify(response));
|
|
1916
1986
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp/client.ts","../src/mcp/client-connection.ts","../src/mcp/sse-edge.ts","../src/mcp/streamable-http-edge.ts"],"sourcesContent":["import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n CallToolRequest,\n CallToolResultSchema,\n CompatibilityCallToolResultSchema,\n GetPromptRequest,\n Prompt,\n ReadResourceRequest,\n Resource,\n ResourceTemplate,\n Tool\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { type ToolSet, jsonSchema } from \"ai\";\nimport { nanoid } from \"nanoid\";\nimport {\n MCPClientConnection,\n type MCPTransportOptions\n} from \"./client-connection\";\n\n/**\n * Utility class that aggregates multiple MCP clients into one\n */\nexport class MCPClientManager {\n public mcpConnections: Record<string, MCPClientConnection> = {};\n private _callbackUrls: string[] = [];\n\n /**\n * @param _name Name of the MCP client\n * @param _version Version of the MCP Client\n * @param auth Auth paramters if being used to create a DurableObjectOAuthClientProvider\n */\n constructor(\n private _name: string,\n private _version: string\n ) {}\n\n /**\n * Connect to and register an MCP server\n *\n * @param transportConfig Transport config\n * @param clientConfig Client config\n * @param capabilities Client capabilities (i.e. if the client supports roots/sampling)\n */\n async connect(\n url: string,\n options: {\n // Allows you to reconnect to a server (in the case of an auth reconnect)\n reconnect?: {\n // server id\n id: string;\n oauthClientId?: string;\n oauthCode?: string;\n };\n // we're overriding authProvider here because we want to be able to access the auth URL\n transport?: MCPTransportOptions;\n client?: ConstructorParameters<typeof Client>[1];\n } = {}\n ): Promise<{\n id: string;\n authUrl?: string;\n clientId?: string;\n }> {\n const id = options.reconnect?.id ?? nanoid(8);\n\n if (!options.transport?.authProvider) {\n console.warn(\n \"No authProvider provided in the transport options. This client will only support unauthenticated remote MCP Servers\"\n );\n } else {\n options.transport.authProvider.serverId = id;\n // reconnect with auth\n if (options.reconnect?.oauthClientId) {\n options.transport.authProvider.clientId =\n options.reconnect?.oauthClientId;\n }\n }\n\n this.mcpConnections[id] = new MCPClientConnection(\n new URL(url),\n {\n name: this._name,\n version: this._version\n },\n {\n client: options.client ?? {},\n transport: options.transport ?? {}\n }\n );\n\n await this.mcpConnections[id].init(options.reconnect?.oauthCode);\n\n const authUrl = options.transport?.authProvider?.authUrl;\n if (authUrl && options.transport?.authProvider?.redirectUrl) {\n this._callbackUrls.push(\n options.transport.authProvider.redirectUrl.toString()\n );\n return {\n authUrl,\n clientId: options.transport?.authProvider?.clientId,\n id\n };\n }\n\n return {\n id\n };\n }\n\n isCallbackRequest(req: Request): boolean {\n return (\n req.method === \"GET\" &&\n !!this._callbackUrls.find((url) => {\n return req.url.startsWith(url);\n })\n );\n }\n\n async handleCallbackRequest(req: Request) {\n const url = new URL(req.url);\n const urlMatch = this._callbackUrls.find((url) => {\n return req.url.startsWith(url);\n });\n if (!urlMatch) {\n throw new Error(\n `No callback URI match found for the request url: ${req.url}. Was the request matched with \\`isCallbackRequest()\\`?`\n );\n }\n const code = url.searchParams.get(\"code\");\n const clientId = url.searchParams.get(\"state\");\n const urlParams = urlMatch.split(\"/\");\n const serverId = urlParams[urlParams.length - 1];\n if (!code) {\n throw new Error(\"Unauthorized: no code provided\");\n }\n if (!clientId) {\n throw new Error(\"Unauthorized: no state provided\");\n }\n\n if (this.mcpConnections[serverId] === undefined) {\n throw new Error(`Could not find serverId: ${serverId}`);\n }\n\n if (this.mcpConnections[serverId].connectionState !== \"authenticating\") {\n throw new Error(\n \"Failed to authenticate: the client isn't in the `authenticating` state\"\n );\n }\n\n const conn = this.mcpConnections[serverId];\n if (!conn.options.transport.authProvider) {\n throw new Error(\n \"Trying to finalize authentication for a server connection without an authProvider\"\n );\n }\n\n conn.options.transport.authProvider.clientId = clientId;\n conn.options.transport.authProvider.serverId = serverId;\n\n // reconnect to server with authorization\n const serverUrl = conn.url.toString();\n await this.connect(serverUrl, {\n reconnect: {\n id: serverId,\n oauthClientId: clientId,\n oauthCode: code\n },\n ...conn.options\n });\n\n if (this.mcpConnections[serverId].connectionState === \"authenticating\") {\n throw new Error(\"Failed to authenticate: client failed to initialize\");\n }\n\n return { serverId };\n }\n\n /**\n * @returns namespaced list of tools\n */\n listTools(): NamespacedData[\"tools\"] {\n return getNamespacedData(this.mcpConnections, \"tools\");\n }\n\n /**\n * @returns a set of tools that you can use with the AI SDK\n */\n unstable_getAITools(): ToolSet {\n return Object.fromEntries(\n getNamespacedData(this.mcpConnections, \"tools\").map((tool) => {\n return [\n `${tool.serverId}_${tool.name}`,\n {\n description: tool.description,\n execute: async (args) => {\n const result = await this.callTool({\n arguments: args,\n name: tool.name,\n serverId: tool.serverId\n });\n if (result.isError) {\n // @ts-expect-error TODO we should fix this\n throw new Error(result.content[0].text);\n }\n return result;\n },\n parameters: jsonSchema(tool.inputSchema)\n }\n ];\n })\n );\n }\n\n /**\n * Closes all connections to MCP servers\n */\n async closeAllConnections() {\n return Promise.all(\n Object.values(this.mcpConnections).map(async (connection) => {\n await connection.client.close();\n })\n );\n }\n\n /**\n * Closes a connection to an MCP server\n * @param id The id of the connection to close\n */\n async closeConnection(id: string) {\n if (!this.mcpConnections[id]) {\n throw new Error(`Connection with id \"${id}\" does not exist.`);\n }\n await this.mcpConnections[id].client.close();\n delete this.mcpConnections[id];\n }\n\n /**\n * @returns namespaced list of prompts\n */\n listPrompts(): NamespacedData[\"prompts\"] {\n return getNamespacedData(this.mcpConnections, \"prompts\");\n }\n\n /**\n * @returns namespaced list of tools\n */\n listResources(): NamespacedData[\"resources\"] {\n return getNamespacedData(this.mcpConnections, \"resources\");\n }\n\n /**\n * @returns namespaced list of resource templates\n */\n listResourceTemplates(): NamespacedData[\"resourceTemplates\"] {\n return getNamespacedData(this.mcpConnections, \"resourceTemplates\");\n }\n\n /**\n * Namespaced version of callTool\n */\n callTool(\n params: CallToolRequest[\"params\"] & { serverId: string },\n resultSchema?:\n | typeof CallToolResultSchema\n | typeof CompatibilityCallToolResultSchema,\n options?: RequestOptions\n ) {\n const unqualifiedName = params.name.replace(`${params.serverId}.`, \"\");\n return this.mcpConnections[params.serverId].client.callTool(\n {\n ...params,\n name: unqualifiedName\n },\n resultSchema,\n options\n );\n }\n\n /**\n * Namespaced version of readResource\n */\n readResource(\n params: ReadResourceRequest[\"params\"] & { serverId: string },\n options: RequestOptions\n ) {\n return this.mcpConnections[params.serverId].client.readResource(\n params,\n options\n );\n }\n\n /**\n * Namespaced version of getPrompt\n */\n getPrompt(\n params: GetPromptRequest[\"params\"] & { serverId: string },\n options: RequestOptions\n ) {\n return this.mcpConnections[params.serverId].client.getPrompt(\n params,\n options\n );\n }\n}\n\ntype NamespacedData = {\n tools: (Tool & { serverId: string })[];\n prompts: (Prompt & { serverId: string })[];\n resources: (Resource & { serverId: string })[];\n resourceTemplates: (ResourceTemplate & { serverId: string })[];\n};\n\nexport function getNamespacedData<T extends keyof NamespacedData>(\n mcpClients: Record<string, MCPClientConnection>,\n type: T\n): NamespacedData[T] {\n const sets = Object.entries(mcpClients).map(([name, conn]) => {\n return { data: conn[type], name };\n });\n\n const namespacedData = sets.flatMap(({ name: serverId, data }) => {\n return data.map((item) => {\n return {\n ...item,\n // we add a serverId so we can easily pull it out and send the tool call to the right server\n serverId\n };\n });\n });\n\n return namespacedData as NamespacedData[T]; // Type assertion needed due to TS limitations with conditional return types\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { SSEClientTransportOptions } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport {\n type ClientCapabilities,\n type ListPromptsResult,\n type ListResourceTemplatesResult,\n type ListResourcesResult,\n type ListToolsResult,\n type Prompt,\n PromptListChangedNotificationSchema,\n type Resource,\n ResourceListChangedNotificationSchema,\n type ResourceTemplate,\n type ServerCapabilities,\n type Tool,\n ToolListChangedNotificationSchema,\n ElicitRequestSchema,\n type ElicitRequest,\n type ElicitResult\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { AgentsOAuthProvider } from \"./do-oauth-client-provider\";\nimport { SSEEdgeClientTransport } from \"./sse-edge\";\nimport { StreamableHTTPEdgeClientTransport } from \"./streamable-http-edge\";\n\nexport type MCPTransportOptions = (\n | SSEClientTransportOptions\n | StreamableHTTPClientTransportOptions\n) & {\n authProvider?: AgentsOAuthProvider;\n type?: \"sse\" | \"streamable-http\" | \"auto\";\n};\n\ntype TransportType = Exclude<MCPTransportOptions[\"type\"], \"auto\">;\n\nexport class MCPClientConnection {\n client: Client;\n connectionState:\n | \"authenticating\"\n | \"connecting\"\n | \"ready\"\n | \"discovering\"\n | \"failed\" = \"connecting\";\n instructions?: string;\n tools: Tool[] = [];\n prompts: Prompt[] = [];\n resources: Resource[] = [];\n resourceTemplates: ResourceTemplate[] = [];\n serverCapabilities: ServerCapabilities | undefined;\n\n constructor(\n public url: URL,\n info: ConstructorParameters<typeof Client>[0],\n public options: {\n transport: MCPTransportOptions;\n client: ConstructorParameters<typeof Client>[1];\n } = { client: {}, transport: {} }\n ) {\n const clientOptions = {\n ...options.client,\n capabilities: {\n ...options.client?.capabilities,\n elicitation: {}\n } as ClientCapabilities\n };\n\n this.client = new Client(info, clientOptions);\n }\n\n /**\n * Initialize a client connection\n *\n * @param code Optional OAuth code to initialize the connection with if auth hasn't been initialized\n * @returns\n */\n async init(code?: string) {\n try {\n const transportType = this.options.transport.type || \"streamable-http\";\n await this.tryConnect(transportType, code);\n // biome-ignore lint/suspicious/noExplicitAny: allow for the error check here\n } catch (e: any) {\n if (e.toString().includes(\"Unauthorized\")) {\n // unauthorized, we should wait for the user to authenticate\n this.connectionState = \"authenticating\";\n return;\n }\n this.connectionState = \"failed\";\n throw e;\n }\n\n this.connectionState = \"discovering\";\n\n this.serverCapabilities = await this.client.getServerCapabilities();\n if (!this.serverCapabilities) {\n throw new Error(\"The MCP Server failed to return server capabilities\");\n }\n\n const [\n instructionsResult,\n toolsResult,\n resourcesResult,\n promptsResult,\n resourceTemplatesResult\n ] = await Promise.allSettled([\n this.client.getInstructions(),\n this.registerTools(),\n this.registerResources(),\n this.registerPrompts(),\n this.registerResourceTemplates()\n ]);\n\n const operations = [\n { name: \"instructions\", result: instructionsResult },\n { name: \"tools\", result: toolsResult },\n { name: \"resources\", result: resourcesResult },\n { name: \"prompts\", result: promptsResult },\n { name: \"resource templates\", result: resourceTemplatesResult }\n ];\n\n for (const { name, result } of operations) {\n if (result.status === \"rejected\") {\n console.error(`Failed to initialize ${name}:`, result.reason);\n }\n }\n\n this.instructions =\n instructionsResult.status === \"fulfilled\"\n ? instructionsResult.value\n : undefined;\n this.tools = toolsResult.status === \"fulfilled\" ? toolsResult.value : [];\n this.resources =\n resourcesResult.status === \"fulfilled\" ? resourcesResult.value : [];\n this.prompts =\n promptsResult.status === \"fulfilled\" ? promptsResult.value : [];\n this.resourceTemplates =\n resourceTemplatesResult.status === \"fulfilled\"\n ? resourceTemplatesResult.value\n : [];\n\n this.connectionState = \"ready\";\n }\n\n /**\n * Notification handler registration\n */\n async registerTools(): Promise<Tool[]> {\n if (!this.serverCapabilities || !this.serverCapabilities.tools) {\n return [];\n }\n\n if (this.serverCapabilities.tools.listChanged) {\n this.client.setNotificationHandler(\n ToolListChangedNotificationSchema,\n async (_notification) => {\n this.tools = await this.fetchTools();\n }\n );\n }\n\n return this.fetchTools();\n }\n\n async registerResources(): Promise<Resource[]> {\n if (!this.serverCapabilities || !this.serverCapabilities.resources) {\n return [];\n }\n\n if (this.serverCapabilities.resources.listChanged) {\n this.client.setNotificationHandler(\n ResourceListChangedNotificationSchema,\n async (_notification) => {\n this.resources = await this.fetchResources();\n }\n );\n }\n\n return this.fetchResources();\n }\n\n async registerPrompts(): Promise<Prompt[]> {\n if (!this.serverCapabilities || !this.serverCapabilities.prompts) {\n return [];\n }\n\n if (this.serverCapabilities.prompts.listChanged) {\n this.client.setNotificationHandler(\n PromptListChangedNotificationSchema,\n async (_notification) => {\n this.prompts = await this.fetchPrompts();\n }\n );\n }\n\n return this.fetchPrompts();\n }\n\n async registerResourceTemplates(): Promise<ResourceTemplate[]> {\n if (!this.serverCapabilities || !this.serverCapabilities.resources) {\n return [];\n }\n\n return this.fetchResourceTemplates();\n }\n\n async fetchTools() {\n let toolsAgg: Tool[] = [];\n let toolsResult: ListToolsResult = { tools: [] };\n do {\n toolsResult = await this.client\n .listTools({\n cursor: toolsResult.nextCursor\n })\n .catch(capabilityErrorHandler({ tools: [] }, \"tools/list\"));\n toolsAgg = toolsAgg.concat(toolsResult.tools);\n } while (toolsResult.nextCursor);\n return toolsAgg;\n }\n\n async fetchResources() {\n let resourcesAgg: Resource[] = [];\n let resourcesResult: ListResourcesResult = { resources: [] };\n do {\n resourcesResult = await this.client\n .listResources({\n cursor: resourcesResult.nextCursor\n })\n .catch(capabilityErrorHandler({ resources: [] }, \"resources/list\"));\n resourcesAgg = resourcesAgg.concat(resourcesResult.resources);\n } while (resourcesResult.nextCursor);\n return resourcesAgg;\n }\n\n async fetchPrompts() {\n let promptsAgg: Prompt[] = [];\n let promptsResult: ListPromptsResult = { prompts: [] };\n do {\n promptsResult = await this.client\n .listPrompts({\n cursor: promptsResult.nextCursor\n })\n .catch(capabilityErrorHandler({ prompts: [] }, \"prompts/list\"));\n promptsAgg = promptsAgg.concat(promptsResult.prompts);\n } while (promptsResult.nextCursor);\n return promptsAgg;\n }\n\n async fetchResourceTemplates() {\n let templatesAgg: ResourceTemplate[] = [];\n let templatesResult: ListResourceTemplatesResult = {\n resourceTemplates: []\n };\n do {\n templatesResult = await this.client\n .listResourceTemplates({\n cursor: templatesResult.nextCursor\n })\n .catch(\n capabilityErrorHandler(\n { resourceTemplates: [] },\n \"resources/templates/list\"\n )\n );\n templatesAgg = templatesAgg.concat(templatesResult.resourceTemplates);\n } while (templatesResult.nextCursor);\n return templatesAgg;\n }\n\n /**\n * Handle elicitation request from server\n * Automatically uses the Agent's built-in elicitation handling if available\n */\n async handleElicitationRequest(\n _request: ElicitRequest\n ): Promise<ElicitResult> {\n // Elicitation handling must be implemented by the platform\n // For MCP servers, this should be handled by McpAgent.elicitInput()\n throw new Error(\n \"Elicitation handler must be implemented for your platform. Override handleElicitationRequest method.\"\n );\n }\n /**\n * Get the transport for the client\n * @param transportType - The transport type to get\n * @returns The transport for the client\n */\n getTransport(transportType: TransportType) {\n switch (transportType) {\n case \"streamable-http\":\n return new StreamableHTTPEdgeClientTransport(\n this.url,\n this.options.transport as StreamableHTTPClientTransportOptions\n );\n case \"sse\":\n return new SSEEdgeClientTransport(\n this.url,\n this.options.transport as SSEClientTransportOptions\n );\n default:\n throw new Error(`Unsupported transport type: ${transportType}`);\n }\n }\n\n async tryConnect(transportType: MCPTransportOptions[\"type\"], code?: string) {\n const transports: TransportType[] =\n transportType === \"auto\" ? [\"streamable-http\", \"sse\"] : [transportType];\n\n for (const currentTransportType of transports) {\n const isLastTransport =\n currentTransportType === transports[transports.length - 1];\n const hasFallback =\n transportType === \"auto\" &&\n currentTransportType === \"streamable-http\" &&\n !isLastTransport;\n\n const transport = await this.getTransport(currentTransportType);\n\n if (code) {\n await transport.finishAuth(code);\n }\n\n try {\n await this.client.connect(transport);\n break;\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n\n if (\n hasFallback &&\n (error.message.includes(\"404\") || error.message.includes(\"405\"))\n ) {\n // try the next transport if we have a fallback\n continue;\n }\n\n throw e;\n }\n }\n\n // Set up elicitation request handler\n this.client.setRequestHandler(\n ElicitRequestSchema,\n async (request: ElicitRequest) => {\n return await this.handleElicitationRequest(request);\n }\n );\n }\n}\n\nfunction capabilityErrorHandler<T>(empty: T, method: string) {\n return (e: { code: number }) => {\n // server is badly behaved and returning invalid capabilities. This commonly occurs for resource templates\n if (e.code === -32601) {\n console.error(\n `The server advertised support for the capability ${method.split(\"/\")[0]}, but returned \"Method not found\" for '${method}'.`\n );\n return empty;\n }\n throw e;\n };\n}\n","import type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport {\n SSEClientTransport,\n type SSEClientTransportOptions\n} from \"@modelcontextprotocol/sdk/client/sse.js\";\n\nexport class SSEEdgeClientTransport extends SSEClientTransport {\n private authProvider: OAuthClientProvider | undefined;\n /**\n * Creates a new EdgeSSEClientTransport, which overrides fetch to be compatible with the CF workers environment\n */\n constructor(url: URL, options: SSEClientTransportOptions) {\n const fetchOverride: typeof fetch = async (\n fetchUrl: RequestInfo | URL,\n fetchInit: RequestInit = {}\n ) => {\n // add auth headers\n const headers = await this.authHeaders();\n const workerOptions = {\n ...fetchInit,\n headers: {\n ...options.requestInit?.headers,\n ...fetchInit?.headers,\n ...headers\n }\n };\n\n // Remove unsupported properties\n delete workerOptions.mode;\n\n // Call the original fetch with fixed options\n return (\n (options.eventSourceInit?.fetch?.(\n fetchUrl as URL | string,\n // @ts-expect-error Expects FetchLikeInit from EventSource but is compatible with RequestInit\n workerOptions\n ) as Promise<Response>) || fetch(fetchUrl, workerOptions)\n );\n };\n\n super(url, {\n ...options,\n eventSourceInit: {\n ...options.eventSourceInit,\n fetch: fetchOverride\n }\n });\n this.authProvider = options.authProvider;\n }\n\n async authHeaders() {\n if (this.authProvider) {\n const tokens = await this.authProvider.tokens();\n if (tokens) {\n return {\n Authorization: `Bearer ${tokens.access_token}`\n };\n }\n }\n }\n}\n","import type { OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport {\n StreamableHTTPClientTransport,\n type StreamableHTTPClientTransportOptions\n} from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\n\nexport class StreamableHTTPEdgeClientTransport extends StreamableHTTPClientTransport {\n private authProvider: OAuthClientProvider | undefined;\n\n /**\n * Creates a new StreamableHTTPEdgeClientTransport, which overrides fetch to be compatible with the CF workers environment\n */\n constructor(url: URL, options: StreamableHTTPClientTransportOptions) {\n const fetchOverride: typeof fetch = async (\n fetchUrl: RequestInfo | URL,\n fetchInit: RequestInit = {}\n ) => {\n // add auth headers\n const headers = await this.authHeaders();\n const workerOptions = {\n ...fetchInit,\n headers: {\n ...options.requestInit?.headers,\n ...fetchInit?.headers,\n ...headers\n }\n };\n\n // Remove unsupported properties\n delete workerOptions.mode;\n\n // Call the original fetch with fixed options\n return (\n // @ts-expect-error Custom fetch function for Cloudflare Workers compatibility\n (options.requestInit?.fetch?.(\n fetchUrl as URL | string,\n workerOptions\n ) as Promise<Response>) || fetch(fetchUrl, workerOptions)\n );\n };\n\n super(url, {\n ...options,\n requestInit: {\n ...options.requestInit,\n // @ts-expect-error Custom fetch override for Cloudflare Workers\n fetch: fetchOverride\n }\n });\n this.authProvider = options.authProvider;\n }\n\n async authHeaders() {\n if (this.authProvider) {\n const tokens = await this.authProvider.tokens();\n if (tokens) {\n return {\n Authorization: `Bearer ${tokens.access_token}`\n };\n }\n }\n }\n}\n"],"mappings":"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","names":["url"]}
|