diff --git a/docs/tool-reference.md b/docs/tool-reference.md index be12f101..216a37fa 100644 --- a/docs/tool-reference.md +++ b/docs/tool-reference.md @@ -258,7 +258,7 @@ **Parameters:** -- **url** (string) **(required)**: The URL of the request. +- **reqid** (number) **(required)**: The reqid of a request on the page from the listed network requests --- diff --git a/src/McpContext.ts b/src/McpContext.ts index 6bf2fa20..99b82696 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -155,19 +155,8 @@ export class McpContext implements Context { await page.close({runBeforeUnload: false}); } - getNetworkRequestByUrl(url: string): HTTPRequest { - const requests = this.getNetworkRequests(); - if (!requests.length) { - throw new Error('No requests found for selected page'); - } - - for (const request of requests) { - if (request.url() === url) { - return request; - } - } - - throw new Error('Request not found for selected page'); + getNetworkRequestById(reqid: number): HTTPRequest { + return this.#networkCollector.getById(this.getSelectedPage(), reqid); } setNetworkConditions(conditions: string | null): void { diff --git a/src/McpResponse.ts b/src/McpResponse.ts index ab36a511..98a979db 100644 --- a/src/McpResponse.ts +++ b/src/McpResponse.ts @@ -24,7 +24,7 @@ import type {ImageContentData, Response} from './tools/ToolDefinition.js'; import {paginate, type PaginationOptions} from './utils/pagination.js'; interface NetworkRequestData { - networkRequestUrl: string; + networkRequestStableId: number; requestBody?: string; responseBody?: string; } @@ -81,9 +81,9 @@ export class McpResponse implements Response { this.#includeConsoleData = value; } - attachNetworkRequest(url: string): void { + attachNetworkRequest(reqid: number): void { this.#attachedNetworkRequestData = { - networkRequestUrl: url, + networkRequestStableId: reqid, }; } @@ -98,8 +98,8 @@ export class McpResponse implements Response { get includeConsoleData(): boolean { return this.#includeConsoleData; } - get attachedNetworkRequestUrl(): string | undefined { - return this.#attachedNetworkRequestData?.networkRequestUrl; + get attachedNetworkRequestId(): number | undefined { + return this.#attachedNetworkRequestData?.networkRequestStableId; } get networkRequestsPageIdx(): number | undefined { return this.#networkRequestsOptions?.pagination?.pageIdx; @@ -138,9 +138,9 @@ export class McpResponse implements Response { let formattedConsoleMessages: string[]; - if (this.#attachedNetworkRequestData?.networkRequestUrl) { - const request = context.getNetworkRequestByUrl( - this.#attachedNetworkRequestData.networkRequestUrl, + if (this.#attachedNetworkRequestData?.networkRequestStableId) { + const request = context.getNetworkRequestById( + this.#attachedNetworkRequestData.networkRequestStableId, ); this.#attachedNetworkRequestData.requestBody = @@ -309,12 +309,12 @@ Call ${handleDialog.name} to handle it before continuing.`); #getIncludeNetworkRequestsData(context: McpContext): string[] { const response: string[] = []; - const url = this.#attachedNetworkRequestData?.networkRequestUrl; + const url = this.#attachedNetworkRequestData?.networkRequestStableId; if (!url) { return response; } - const httpRequest = context.getNetworkRequestByUrl(url); + const httpRequest = context.getNetworkRequestById(url); response.push(`## Request ${httpRequest.url()}`); response.push(`Status: ${getStatusFromRequest(httpRequest)}`); response.push(`### Request Headers`); diff --git a/src/PageCollector.ts b/src/PageCollector.ts index fa10c215..69615c50 100644 --- a/src/PageCollector.ts +++ b/src/PageCollector.ts @@ -133,6 +133,21 @@ export class PageCollector { getIdForResource(resource: WithSymbolId): number { return resource[stableIdSymbol] ?? -1; } + + getById(page: Page, stableId: number): T { + const data = this.storage.get(page); + if (!data || !data.length) { + throw new Error('No requests found for selected page'); + } + + for (const collected of data) { + if (collected[stableIdSymbol] === stableId) { + return collected; + } + } + + throw new Error('Request not found for selected page'); + } } export class NetworkCollector extends PageCollector { diff --git a/src/tools/ToolDefinition.ts b/src/tools/ToolDefinition.ts index 56fdb53a..6b1c92ae 100644 --- a/src/tools/ToolDefinition.ts +++ b/src/tools/ToolDefinition.ts @@ -50,7 +50,7 @@ export interface Response { setIncludeConsoleData(value: boolean): void; setIncludeSnapshot(value: boolean): void; attachImage(value: ImageContentData): void; - attachNetworkRequest(url: string): void; + attachNetworkRequest(reqid: number): void; } /** diff --git a/src/tools/network.ts b/src/tools/network.ts index 1fc82a5a..23b2c1f6 100644 --- a/src/tools/network.ts +++ b/src/tools/network.ts @@ -80,9 +80,13 @@ export const getNetworkRequest = defineTool({ readOnlyHint: true, }, schema: { - url: z.string().describe('The URL of the request.'), + reqid: z + .number() + .describe( + 'The reqid of a request on the page from the listed network requests', + ), }, handler: async (request, response, _context) => { - response.attachNetworkRequest(request.params.url); + response.attachNetworkRequest(request.params.reqid); }, }); diff --git a/tests/McpResponse.test.ts b/tests/McpResponse.test.ts index b293cc06..30fdf2a2 100644 --- a/tests/McpResponse.test.ts +++ b/tests/McpResponse.test.ts @@ -248,7 +248,10 @@ reqid=2 GET http://example.com [pending]`, context.getNetworkRequests = () => { return [request]; }; - response.attachNetworkRequest(request.url()); + context.getNetworkRequestById = () => { + return request; + }; + response.attachNetworkRequest(1); const result = await response.handle('test', context); @@ -279,7 +282,10 @@ reqid=1 POST http://example.com [success - 200]`, context.getNetworkRequests = () => { return [request]; }; - response.attachNetworkRequest(request.url()); + context.getNetworkRequestById = () => { + return request; + }; + response.attachNetworkRequest(1); const result = await response.handle('test', context); assert.strictEqual( result[0].text, diff --git a/tests/tools/network.test.ts b/tests/tools/network.test.ts index c53cbc1d..fa6439dd 100644 --- a/tests/tools/network.test.ts +++ b/tests/tools/network.test.ts @@ -28,14 +28,11 @@ describe('network', () => { const page = await context.getSelectedPage(); await page.goto('data:text/html,
Hello MCP
'); await getNetworkRequest.handler( - {params: {url: 'data:text/html,
Hello MCP
'}}, + {params: {reqid: 1}}, response, context, ); - assert.equal( - response.attachedNetworkRequestUrl, - 'data:text/html,
Hello MCP
', - ); + assert.equal(response.attachedNetworkRequestId, 1); }); }); it('should not add the request list', async () => { @@ -43,7 +40,7 @@ describe('network', () => { const page = await context.getSelectedPage(); await page.goto('data:text/html,
Hello MCP
'); await getNetworkRequest.handler( - {params: {url: 'data:text/html,
Hello MCP
'}}, + {params: {reqid: 1}}, response, context, );