Skip to content

Commit d25b7c6

Browse files
committed
feat: implementation of service worker
1 parent 90d368d commit d25b7c6

13 files changed

Lines changed: 444 additions & 30 deletions

docs/tool-reference.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<!-- AUTO GENERATED DO NOT EDIT - run 'npm run gen' to update-->
22

33
# Chrome DevTools MCP Tool Reference
4+
# Chrome DevTools MCP Tool Reference (~7005 cl100k_base tokens)
45

56
- **[Input automation](#input-automation)** (10 tools)
67
- [`click`](#click)
@@ -345,12 +346,12 @@ so returned values have to be JSON-serializable.
345346
**Parameters:**
346347

347348
- **function** (string) **(required)**: A JavaScript function declaration to be executed by the tool in the currently selected page.
348-
Example without arguments: `() => {
349+
Example without arguments: `() => {
349350
return document.title
350351
}` or `async () => {
351352
return await fetch("example.com")
352353
}`.
353-
Example with arguments: `(el) => {
354+
Example with arguments: `(el) => {
354355
return el.innerText;
355356
}`
356357

@@ -362,7 +363,7 @@ so returned values have to be JSON-serializable.
362363

363364
### `get_console_message`
364365

365-
**Description:** Gets a console message by its ID. You can get all messages by calling [`list_console_messages`](#list_console_messages).
366+
**Description:** Gets a console message by its ID. You can get all messages by calling .
366367

367368
**Parameters:**
368369

src/McpContext.ts

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,24 @@ import {
2020
type ListenerMap,
2121
type UncaughtError,
2222
} from './PageCollector.js';
23-
import {
24-
Locator,
25-
PredefinedNetworkConditions,
26-
type Browser,
27-
type BrowserContext,
28-
type ConsoleMessage,
29-
type Debugger,
30-
type HTTPRequest,
31-
type Page,
32-
type ScreenRecorder,
33-
type Viewport,
34-
type Target,
35-
type Extension,
36-
type Root,
37-
type DevTools,
23+
import {ServiceWorkerConsoleCollector} from './ServiceWorkerCollector.js';
24+
import type {DevTools} from './third_party/index.js';
25+
import type {
26+
Browser,
27+
BrowserContext,
28+
ConsoleMessage,
29+
Debugger,
30+
HTTPRequest,
31+
Page,
32+
ScreenRecorder,
33+
SerializedAXNode,
34+
Viewport,
35+
Target,
36+
Extension,
3837
} from './third_party/index.js';
38+
import type {DevTools} from './third_party/index.js';
39+
import {Locator} from './third_party/index.js';
40+
import {PredefinedNetworkConditions} from './third_party/index.js';
3941
import {listPages} from './tools/pages.js';
4042
import {CLOSE_PAGE_ERROR} from './tools/ToolDefinition.js';
4143
import type {Context, SupportedExtensions} from './tools/ToolDefinition.js';
@@ -77,6 +79,7 @@ export class McpContext implements Context {
7779
#networkCollector: NetworkCollector;
7880
#consoleCollector: ConsoleCollector;
7981
#devtoolsUniverseManager: UniverseManager;
82+
#serviceWorkerConsoleCollector: ServiceWorkerConsoleCollector;
8083

8184
#isRunningTrace = false;
8285
#screenRecorderData: {recorder: ScreenRecorder; filePath: string} | null =
@@ -121,21 +124,26 @@ export class McpContext implements Context {
121124
},
122125
} as ListenerMap;
123126
});
127+
this.#serviceWorkerConsoleCollector = new ServiceWorkerConsoleCollector(
128+
this.browser,
129+
);
124130
this.#devtoolsUniverseManager = new UniverseManager(this.browser);
125131
}
126132

127133
async #init() {
128134
const pages = await this.createPagesSnapshot();
129-
await this.createExtensionServiceWorkersSnapshot();
135+
const workers = await this.createExtensionServiceWorkersSnapshot();
130136
await this.#networkCollector.init(pages);
131137
await this.#consoleCollector.init(pages);
132138
await this.#devtoolsUniverseManager.init(pages);
139+
await this.#serviceWorkerConsoleCollector.init(workers);
133140
}
134141

135142
dispose() {
136143
this.#networkCollector.dispose();
137144
this.#consoleCollector.dispose();
138145
this.#devtoolsUniverseManager.dispose();
146+
this.#serviceWorkerConsoleCollector.dispose();
139147
for (const mcpPage of this.#mcpPages.values()) {
140148
mcpPage.dispose();
141149
}
@@ -524,6 +532,12 @@ export class McpContext implements Context {
524532
return this.#extensionServiceWorkers;
525533
}
526534

535+
getServiceWorkerConsoleData(
536+
extensionId: string,
537+
): Array<ConsoleMessage | UncaughtError> {
538+
return this.#serviceWorkerConsoleCollector.getData(extensionId);
539+
}
540+
527541
async createPagesSnapshot(): Promise<Page[]> {
528542
const {pages: allPages, isolatedContextNames} = await this.#getAllPages();
529543

src/McpResponse.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ export class McpResponse implements Response {
197197
pagination?: PaginationOptions;
198198
types?: string[];
199199
includePreservedMessages?: boolean;
200+
serviceWorkerId?: string;
200201
};
201202
#listExtensions?: boolean;
202203
#listThirdPartyDeveloperTools?: boolean;
@@ -289,6 +290,7 @@ export class McpResponse implements Response {
289290
options?: PaginationOptions & {
290291
types?: string[];
291292
includePreservedMessages?: boolean;
293+
serviceWorkerId?: string;
292294
},
293295
): void {
294296
if (!value) {
@@ -307,6 +309,7 @@ export class McpResponse implements Response {
307309
: undefined,
308310
types: options?.types,
309311
includePreservedMessages: options?.includePreservedMessages,
312+
serviceWorkerId: options?.serviceWorkerId,
310313
};
311314
}
312315

@@ -582,14 +585,23 @@ export class McpResponse implements Response {
582585

583586
let consoleMessages: Array<ConsoleFormatter | IssueFormatter> | undefined;
584587
if (this.#consoleDataOptions?.include) {
585-
if (!this.#page) {
586-
throw new Error(`Response must have an McpPage`);
588+
let messages;
589+
let page: McpPage | undefined;
590+
591+
if (this.#consoleDataOptions.serviceWorkerId) {
592+
messages = context.getServiceWorkerConsoleData(
593+
this.#consoleDataOptions.serviceWorkerId,
594+
);
595+
} else {
596+
page = this.#page;
597+
if (!page) {
598+
throw new Error(`Response must have an McpPage`);
599+
}
600+
messages = context.getConsoleData(
601+
page,
602+
this.#consoleDataOptions.includePreservedMessages,
603+
);
587604
}
588-
const page = this.#page;
589-
let messages = context.getConsoleData(
590-
this.#page,
591-
this.#consoleDataOptions.includePreservedMessages,
592-
);
593605

594606
if (this.#consoleDataOptions.types?.length) {
595607
const normalizedTypes = new Set(this.#consoleDataOptions.types);
@@ -612,7 +624,9 @@ export class McpResponse implements Response {
612624
context.getConsoleMessageStableId(item);
613625
if ('args' in item || item instanceof UncaughtError) {
614626
const consoleMessage = item as ConsoleMessage | UncaughtError;
615-
const devTools = context.getDevToolsUniverse(page);
627+
const devTools = page
628+
? context.getDevToolsUniverse(page)
629+
: null;
616630
return await ConsoleFormatter.from(consoleMessage, {
617631
id: consoleMessageStableId,
618632
fetchDetailedData: false,

src/PageCollector.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,11 @@ export class PageCollector<T> {
194194

195195
const item = this.find(page, item => item[stableIdSymbol] === stableId);
196196

197-
if (item) {
198-
return item;
197+
if (!item) {
198+
throw new Error('Request not found for selected page');
199199
}
200200

201-
throw new Error('Request not found for selected page');
201+
return item;
202202
}
203203

204204
find(

0 commit comments

Comments
 (0)