diff options
| author | Jack Wotherspoon <[email protected]> | 2025-07-11 15:59:42 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-11 19:59:42 +0000 |
| commit | 2826c7a1c60bc09d256d7a7c11bdd98f65316cb7 (patch) | |
| tree | cb9e58b8d412df05108f8423b0614394598c7d54 /packages/core/src/tools/mcp-client.test.ts | |
| parent | 8f12e8a114546326ee5b39d6aae859da6d906d0b (diff) | |
feat: add headers support to SSE transport MCP servers (#3902)
Diffstat (limited to 'packages/core/src/tools/mcp-client.test.ts')
| -rw-r--r-- | packages/core/src/tools/mcp-client.test.ts | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/packages/core/src/tools/mcp-client.test.ts b/packages/core/src/tools/mcp-client.test.ts index 1413a4f8..a70a0db2 100644 --- a/packages/core/src/tools/mcp-client.test.ts +++ b/packages/core/src/tools/mcp-client.test.ts @@ -284,7 +284,10 @@ describe('discoverMcpTools', () => { mockToolRegistry as any, ); - expect(SSEClientTransport).toHaveBeenCalledWith(new URL(serverConfig.url!)); + expect(SSEClientTransport).toHaveBeenCalledWith( + new URL(serverConfig.url!), + {}, + ); expect(mockToolRegistry.registerTool).toHaveBeenCalledWith( expect.any(DiscoveredMCPTool), ); @@ -293,6 +296,75 @@ describe('discoverMcpTools', () => { expect(registeredTool.name).toBe('tool-sse'); }); + describe('SseClientTransport headers', () => { + const setupSseTest = async (headers?: Record<string, string>) => { + const serverConfig: MCPServerConfig = { + url: 'http://localhost:1234/sse', + ...(headers && { headers }), + }; + const serverName = headers + ? 'sse-server-with-headers' + : 'sse-server-no-headers'; + const toolName = headers ? 'tool-http-headers' : 'tool-http-no-headers'; + + mockConfig.getMcpServers.mockReturnValue({ [serverName]: serverConfig }); + + const mockTool = { + name: toolName, + description: `desc-${toolName}`, + inputSchema: { type: 'object' as const, properties: {} }, + }; + vi.mocked(Client.prototype.listTools).mockResolvedValue({ + tools: [mockTool], + }); + mockToolRegistry.getToolsByServer.mockReturnValueOnce([ + expect.any(DiscoveredMCPTool), + ]); + + await discoverMcpTools( + mockConfig.getMcpServers() ?? {}, + mockConfig.getMcpServerCommand(), + mockToolRegistry as any, + ); + + return { serverConfig }; + }; + + it('should pass headers when provided', async () => { + const headers = { + Authorization: 'Bearer test-token', + 'X-Custom-Header': 'custom-value', + }; + const { serverConfig } = await setupSseTest(headers); + + expect(SSEClientTransport).toHaveBeenCalledWith( + new URL(serverConfig.url!), + { requestInit: { headers } }, + ); + }); + + it('should work without headers (backwards compatibility)', async () => { + const { serverConfig } = await setupSseTest(); + + expect(SSEClientTransport).toHaveBeenCalledWith( + new URL(serverConfig.url!), + {}, + ); + }); + + it('should pass oauth token when provided', async () => { + const headers = { + Authorization: 'Bearer test-token', + }; + const { serverConfig } = await setupSseTest(headers); + + expect(SSEClientTransport).toHaveBeenCalledWith( + new URL(serverConfig.url!), + { requestInit: { headers } }, + ); + }); + }); + it('should discover tools via mcpServers config (streamable http)', async () => { const serverConfig: MCPServerConfig = { httpUrl: 'http://localhost:3000/mcp', |
