Skip to content

Commit 2e09baf

Browse files
authored
fix: #699 Forward fetch parameter to SSEClientTransport in MCPServerSSE (#700)
1 parent 1900729 commit 2e09baf

File tree

4 files changed

+114
-1
lines changed

4 files changed

+114
-1
lines changed

.changeset/brave-regions-hug.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@openai/agents-core': patch
3+
---
4+
5+
fix: #699 Forward fetch parameter to SSEClientTransport in MCPServerSSE

packages/agents-core/src/mcp.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,9 @@ export interface MCPServerSSEOptions {
603603
authProvider?: any;
604604
// RequestInit
605605
requestInit?: any;
606+
// Custom fetch implementation used for all network requests.
607+
// import { FetchLike } from '@modelcontextprotocol/sdk/shared/transport.js';
608+
fetch?: any;
606609
// import { SSEReconnectionOptions } from '@modelcontextprotocol/sdk/client/sse.js';
607610
eventSourceInit?: any;
608611
// ----------------------------------------------------

packages/agents-core/src/shims/mcp-server/node.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ export class NodeMCPServerSSE extends BaseMCPServerSSE {
200200
authProvider: this.params.authProvider,
201201
requestInit: this.params.requestInit,
202202
eventSourceInit: this.params.eventSourceInit,
203+
fetch: this.params.fetch,
203204
});
204205
this.session = new Client({
205206
name: this._name,

packages/agents-core/test/shims/mcp-server/node.test.ts

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { describe, test, expect, vi, afterAll, beforeAll } from 'vitest';
2-
import { NodeMCPServerStdio } from '../../../src/shims/mcp-server/node';
2+
import {
3+
NodeMCPServerStdio,
4+
NodeMCPServerSSE,
5+
} from '../../../src/shims/mcp-server/node';
36
import { TransportSendOptions } from '@modelcontextprotocol/sdk/shared/transport';
47
import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types';
58

@@ -86,3 +89,104 @@ class MockClient {
8689
return Promise.resolve();
8790
}
8891
}
92+
93+
let capturedFetch: any = undefined;
94+
95+
class MockSSEClientTransport {
96+
url: URL;
97+
options: {
98+
authProvider?: any;
99+
requestInit?: any;
100+
eventSourceInit?: any;
101+
fetch?: any;
102+
};
103+
104+
constructor(
105+
url: URL,
106+
options: {
107+
authProvider?: any;
108+
requestInit?: any;
109+
eventSourceInit?: any;
110+
fetch?: any;
111+
},
112+
) {
113+
this.url = url;
114+
this.options = options;
115+
capturedFetch = options.fetch;
116+
}
117+
118+
start(): Promise<void> {
119+
return Promise.resolve();
120+
}
121+
122+
send(
123+
_message: JSONRPCMessage,
124+
_options?: TransportSendOptions,
125+
): Promise<void> {
126+
return Promise.resolve();
127+
}
128+
129+
close(): Promise<void> {
130+
return Promise.resolve();
131+
}
132+
}
133+
134+
describe('NodeMCPServerSSE', () => {
135+
beforeAll(() => {
136+
vi.mock(
137+
'@modelcontextprotocol/sdk/client/sse.js',
138+
async (importOriginal) => {
139+
return {
140+
...(await importOriginal()),
141+
SSEClientTransport: MockSSEClientTransport,
142+
};
143+
},
144+
);
145+
vi.mock(
146+
'@modelcontextprotocol/sdk/client/index.js',
147+
async (importOriginal) => {
148+
return {
149+
...(await importOriginal()),
150+
Client: MockClient,
151+
};
152+
},
153+
);
154+
});
155+
156+
test('should forward custom fetch to SSEClientTransport', async () => {
157+
const customFetch = vi.fn(async (_input, _init) => {
158+
return new Response('{}', { status: 200 });
159+
});
160+
161+
const server = new NodeMCPServerSSE({
162+
url: 'https://example.com/sse',
163+
name: 'test-sse-server',
164+
fetch: customFetch,
165+
});
166+
167+
expect(server).toBeDefined();
168+
expect(server.name).toBe('test-sse-server');
169+
170+
await server.connect();
171+
172+
expect(capturedFetch).toBe(customFetch);
173+
174+
await server.close();
175+
});
176+
177+
test('should accept SSE server without custom fetch', async () => {
178+
const server = new NodeMCPServerSSE({
179+
url: 'https://example.com/sse',
180+
name: 'test-sse-server-no-fetch',
181+
});
182+
183+
expect(server).toBeDefined();
184+
await server.connect();
185+
await server.close();
186+
});
187+
188+
afterAll(() => {
189+
vi.clearAllMocks();
190+
capturedFetch = undefined;
191+
});
192+
});

0 commit comments

Comments
 (0)