Skip to content

Commit bbcc6db

Browse files
committed
feat: Support filtering by request type in list_network_requests
1 parent 5be157e commit bbcc6db

File tree

7 files changed

+352
-120
lines changed

7 files changed

+352
-120
lines changed

src/McpResponse.ts

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import { formatA11ySnapshot } from './formatters/snapshotFormatter.js';
1515
import { formatConsoleEvent } from './formatters/consoleFormatter.js';
1616
import {
1717
paginateNetworkRequests,
18-
type NetworkPaginationOptions,
19-
} from './utils/networkPagination.js';
18+
type NetworkRequestsListingOptions,
19+
sanitizeRequestTypeFilter,
20+
} from './utils/networkUtils.js';
2021

2122
export class McpResponse implements Response {
2223
#includePages: boolean = false;
@@ -27,7 +28,7 @@ export class McpResponse implements Response {
2728
#textResponseLines: string[] = [];
2829
#formattedConsoleData?: string[];
2930
#images: ImageContentData[] = [];
30-
#networkRequestsPaginationOptions?: NetworkPaginationOptions;
31+
#networkRequestsPaginationOptions?: NetworkRequestsListingOptions;
3132

3233
setIncludePages(value: boolean): void {
3334
this.#includePages = value;
@@ -39,7 +40,7 @@ export class McpResponse implements Response {
3940

4041
setIncludeNetworkRequests(
4142
value: boolean,
42-
options?: { pageSize?: number; pageToken?: string | null },
43+
options?: NetworkRequestsListingOptions,
4344
): void {
4445
this.#includeNetworkRequests = value;
4546
if (!value) {
@@ -52,13 +53,21 @@ export class McpResponse implements Response {
5253
return;
5354
}
5455

55-
const sanitizedOptions: NetworkPaginationOptions = {};
56+
const sanitizedOptions: NetworkRequestsListingOptions = {};
5657
if (options.pageSize !== undefined) {
5758
sanitizedOptions.pageSize = options.pageSize;
5859
}
5960
if (options.pageToken !== undefined) {
6061
sanitizedOptions.pageToken = options.pageToken ?? undefined;
6162
}
63+
if (options.requestType !== undefined) {
64+
const sanitizedRequestType = sanitizeRequestTypeFilter(
65+
options.requestType,
66+
);
67+
if (sanitizedRequestType !== undefined) {
68+
sanitizedOptions.requestType = sanitizedRequestType;
69+
}
70+
}
6271

6372
this.#networkRequestsPaginationOptions =
6473
Object.keys(sanitizedOptions).length > 0 ? sanitizedOptions : undefined;
@@ -193,18 +202,33 @@ Call browser_handle_dialog to handle it before continuing.`);
193202
if (this.#includeNetworkRequests) {
194203
const requests = context.getNetworkRequests();
195204
response.push('## Network requests');
196-
if (requests.length) {
197-
const paginationResult = paginateNetworkRequests(
198-
requests,
199-
this.#networkRequestsPaginationOptions,
200-
);
201-
if (paginationResult.invalidToken) {
202-
response.push('Invalid page token provided. Showing first page.');
205+
const paginationOptions = this.#networkRequestsPaginationOptions;
206+
const paginationResult = paginateNetworkRequests(
207+
requests,
208+
paginationOptions,
209+
);
210+
211+
if (paginationResult.appliedRequestType) {
212+
const summary = Array.isArray(paginationResult.appliedRequestType)
213+
? paginationResult.appliedRequestType.join(', ')
214+
: paginationResult.appliedRequestType;
215+
response.push(`Filtered by type: ${summary}`);
216+
}
217+
218+
if (paginationResult.invalidToken) {
219+
response.push('Invalid page token provided. Showing first page.');
220+
}
221+
222+
const { startIndex, endIndex, total } = paginationResult;
223+
if (total === 0) {
224+
if (paginationOptions?.requestType) {
225+
response.push('No requests found for the selected type(s).');
226+
} else {
227+
response.push('No requests found.');
203228
}
204-
const { startIndex, endIndex } = paginationResult;
205-
response.push(
206-
`Showing ${startIndex + 1}-${endIndex} of ${requests.length}.`,
207-
);
229+
}
230+
else {
231+
response.push(`Showing ${startIndex + 1}-${endIndex} of ${total}.`);
208232
for (const request of paginationResult.requests) {
209233
response.push(getShortDescriptionForRequest(request));
210234
}
@@ -214,8 +238,6 @@ Call browser_handle_dialog to handle it before continuing.`);
214238
if (paginationResult.previousPageToken) {
215239
response.push(`Prev: ${paginationResult.previousPageToken}`);
216240
}
217-
} else {
218-
response.push('No requests found.');
219241
}
220242
}
221243

src/tools/ToolDefinition.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import z from 'zod';
88
import { Dialog, ElementHandle, Page } from 'puppeteer-core';
9+
import type { FilterableResourceType } from '../utils/networkUtils.js';
910
import { ToolCategories } from './categories.js';
1011
import { TraceResult } from '../trace-processing/parse.js';
1112

@@ -39,12 +40,18 @@ export type ImageContentData = {
3940
mimeType: string;
4041
};
4142

43+
export type NetworkRequestsOptions = {
44+
pageSize?: number;
45+
pageToken?: string | null;
46+
requestType?: FilterableResourceType | FilterableResourceType[] | null;
47+
};
48+
4249
export interface Response {
4350
appendResponseLine(value: string): void;
4451
setIncludePages(value: boolean): void;
4552
setIncludeNetworkRequests(
4653
value: boolean,
47-
options?: { pageSize?: number; pageToken?: string | null },
54+
options?: NetworkRequestsOptions,
4855
): void;
4956
setIncludeConsoleData(value: boolean): void;
5057
setIncludeSnapshot(value: boolean): void;

src/tools/network.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
import z from 'zod';
8+
import { FILTERABLE_RESOURCE_TYPES } from '../utils/networkUtils.js';
89
import { defineTool } from './ToolDefinition.js';
910
import { ToolCategories } from './categories.js';
1011

@@ -31,11 +32,18 @@ export const listNetworkRequests = defineTool({
3132
.describe(
3233
'Opaque token representing the next page. Use the token returned by a previous call.',
3334
),
35+
requestType: z
36+
.enum(FILTERABLE_RESOURCE_TYPES)
37+
.optional()
38+
.describe(
39+
`Type of request to return. When omitted, returns all requests. Available types are: ${FILTERABLE_RESOURCE_TYPES.join(', ')}.`,
40+
),
3441
},
3542
handler: async (request, response) => {
3643
response.setIncludeNetworkRequests(true, {
3744
pageSize: request.params.pageSize,
3845
pageToken: request.params.pageToken ?? null,
46+
requestType: request.params.requestType ?? null,
3947
});
4048
},
4149
});

src/utils/networkPagination.ts

Lines changed: 0 additions & 92 deletions
This file was deleted.

0 commit comments

Comments
 (0)