diff --git a/packages/playwright-core/src/mcp/browser/config.ts b/packages/playwright-core/src/mcp/browser/config.ts index 2ecbf7acbd791..0491cec075ced 100644 --- a/packages/playwright-core/src/mcp/browser/config.ts +++ b/packages/playwright-core/src/mcp/browser/config.ts @@ -521,7 +521,11 @@ export function headerParser(arg: string | undefined, previous?: Record = previous || {}; - const [name, value] = arg.split(':').map(v => v.trim()); + const colonIndex = arg.indexOf(':'); + if (colonIndex === -1) + return result; + const name = arg.substring(0, colonIndex).trim(); + const value = arg.substring(colonIndex + 1).trim(); result[name] = value; return result; } diff --git a/tests/mcp/cdp.spec.ts b/tests/mcp/cdp.spec.ts index f05ea7c306421..d8483511fdac1 100644 --- a/tests/mcp/cdp.spec.ts +++ b/tests/mcp/cdp.spec.ts @@ -110,3 +110,21 @@ test('cdp server with headers', async ({ startClient, server }) => { }); expect(authHeader).toBe('Bearer 1234567890'); }); + +test('cdp server with headers containing colons', async ({ startClient, server }) => { + // Regression test for https://github.com/microsoft/playwright-mcp/issues/1417 + let customHeader = ''; + server.setRoute('/json/version/', (req, res) => { + customHeader = req.headers['x-custom']; + res.end(); + }); + + const { client } = await startClient({ args: [`--cdp-endpoint=${server.PREFIX}`, '--cdp-header', 'X-Custom: http://example.com:8080/path'] }); + expect(await client.callTool({ + name: 'browser_navigate', + arguments: { url: server.HELLO_WORLD }, + })).toHaveResponse({ + isError: true, + }); + expect(customHeader).toBe('http://example.com:8080/path'); +});