From b06875282779076632c3c934a8c7f25308e7850d Mon Sep 17 00:00:00 2001 From: Andrei Tuicu Date: Mon, 15 Jun 2026 11:17:42 +0200 Subject: [PATCH 1/2] fix: Remove redunant timeout call --- src/mcp/tool-adapter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mcp/tool-adapter.ts b/src/mcp/tool-adapter.ts index 7308b14..d0c7930 100644 --- a/src/mcp/tool-adapter.ts +++ b/src/mcp/tool-adapter.ts @@ -160,7 +160,7 @@ export async function connectAndRegisterMCPTools( const client = new MCPClient(url, { headers: serverHeaders, timeout: options?.timeout ?? 15000, - callToolTimeout: options?.callToolTimeout ?? 60000, + callToolTimeout: options?.callToolTimeout, }); try { From ddf6850b2b0324d35cda65e31b61aa92fc4704d9 Mon Sep 17 00:00:00 2001 From: Andrei Tuicu Date: Mon, 15 Jun 2026 11:39:36 +0200 Subject: [PATCH 2/2] fix: Add test for timeout threading --- test/mcp/tool-adapter.test.ts | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 test/mcp/tool-adapter.test.ts diff --git a/test/mcp/tool-adapter.test.ts b/test/mcp/tool-adapter.test.ts new file mode 100644 index 0000000..9b55ce7 --- /dev/null +++ b/test/mcp/tool-adapter.test.ts @@ -0,0 +1,42 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { connectAndRegisterMCPTools } from '../../src/mcp/tool-adapter.js'; + +const { MockMCPClient, mockInitialize, mockListTools } = vi.hoisted(() => { + const initialize = vi.fn().mockResolvedValue(undefined); + const listTools = vi.fn().mockResolvedValue([]); + const Client = vi.fn().mockImplementation(() => ({ initialize, listTools })); + return { MockMCPClient: Client, mockInitialize: initialize, mockListTools: listTools }; +}); + +vi.mock('../../src/mcp/client.js', () => ({ + MCPClient: MockMCPClient, +})); + +const minimalConfig = { + mcpServers: { 'test-server': { type: 'http' as const, url: 'https://mcp.example.com/mcp' } }, + toolAllowPatterns: ['*'], +}; + +beforeEach(() => { + vi.clearAllMocks(); + mockInitialize.mockResolvedValue(undefined); + mockListTools.mockResolvedValue([]); +}); + +describe('connectAndRegisterMCPTools', () => { + it('passes callToolTimeout through to MCPClient constructor', async () => { + await connectAndRegisterMCPTools(minimalConfig, { callToolTimeout: 5000 }); + expect(MockMCPClient).toHaveBeenCalledWith( + 'https://mcp.example.com/mcp', + expect.objectContaining({ callToolTimeout: 5000 }), + ); + }); + + it('passes callToolTimeout as undefined when not provided, letting MCPClient use its default', async () => { + await connectAndRegisterMCPTools(minimalConfig); + expect(MockMCPClient).toHaveBeenCalledWith( + 'https://mcp.example.com/mcp', + expect.objectContaining({ callToolTimeout: undefined }), + ); + }); +});