From d89afe35589551e1453db61af8402e09a3658b11 Mon Sep 17 00:00:00 2001 From: Zelys Date: Tue, 12 May 2026 18:17:11 -0500 Subject: [PATCH 1/2] fix(test): extend cloudflare workers retry to cover full request cycle Wrangler on Node 20 accepts the initialize handshake before it can reliably handle subsequent requests. The previous retry loop only wrapped connect(), so a successful connect followed by a failed callTool() still caused the test to fail. Extend the loop to retry the full interaction (connect + callTool + assertion) and close the client on each failed attempt before retrying. --- .../test/server/cloudflareWorkers.test.ts | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/test/integration/test/server/cloudflareWorkers.test.ts b/test/integration/test/server/cloudflareWorkers.test.ts index 9c2d73a40e..1cfa9a38d2 100644 --- a/test/integration/test/server/cloudflareWorkers.test.ts +++ b/test/integration/test/server/cloudflareWorkers.test.ts @@ -150,28 +150,25 @@ export default { it('should handle MCP requests', async () => { expect(env).not.toBeNull(); - // Retry connection — wrangler may report "Ready" before it can handle requests - let client!: Client; + // Retry the full interaction — wrangler may report "Ready" before it can + // reliably handle all requests (initialize succeeds but subsequent calls + // can still get "Network connection lost." on slower runtimes like Node 20). let lastError: unknown; for (let attempt = 0; attempt < 5; attempt++) { + const client = new Client({ name: 'test-client', version: '1.0.0' }); + const transport = new StreamableHTTPClientTransport(new URL(`http://127.0.0.1:${PORT}/`)); try { - client = new Client({ name: 'test-client', version: '1.0.0' }); - const transport = new StreamableHTTPClientTransport(new URL(`http://127.0.0.1:${PORT}/`)); await client.connect(transport); - lastError = undefined; - break; + const result = await client.callTool({ name: 'greet', arguments: { name: 'World' } }); + expect(result.content).toEqual([{ type: 'text', text: 'Hello, World!' }]); + await client.close(); + return; } catch (error) { lastError = error; - await new Promise(resolve => setTimeout(resolve, 1000)); + try { await client.close(); } catch { /* ignore cleanup errors */ } + if (attempt < 4) await new Promise(resolve => setTimeout(resolve, 1000)); } } - if (lastError) { - throw lastError; - } - - const result = await client.callTool({ name: 'greet', arguments: { name: 'World' } }); - expect(result.content).toEqual([{ type: 'text', text: 'Hello, World!' }]); - - await client.close(); + throw lastError; }, 30_000); }); From 7654565ff72b25432b36c03c0a8b1c8e06eaa2ae Mon Sep 17 00:00:00 2001 From: Zelys Date: Tue, 12 May 2026 18:24:04 -0500 Subject: [PATCH 2/2] style: fix prettier formatting in cloudflare workers test --- test/integration/test/server/cloudflareWorkers.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/integration/test/server/cloudflareWorkers.test.ts b/test/integration/test/server/cloudflareWorkers.test.ts index 1cfa9a38d2..f8b07f2966 100644 --- a/test/integration/test/server/cloudflareWorkers.test.ts +++ b/test/integration/test/server/cloudflareWorkers.test.ts @@ -165,7 +165,11 @@ export default { return; } catch (error) { lastError = error; - try { await client.close(); } catch { /* ignore cleanup errors */ } + try { + await client.close(); + } catch { + /* ignore cleanup errors */ + } if (attempt < 4) await new Promise(resolve => setTimeout(resolve, 1000)); } }