opera-devtools-mcp 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -33
- package/build/src/WaitForHelper.js +9 -2
- package/build/src/bin/chrome-devtools-cli-options.js +68 -212
- package/build/src/bin/opera-devtools-mcp-main.js +1 -1
- package/build/src/index.js +38 -22
- package/build/src/third_party/THIRD_PARTY_NOTICES +4322 -0
- package/build/src/third_party/bundled-packages.json +11 -0
- package/build/src/third_party/devtools-formatter-worker.js +15299 -7
- package/build/src/third_party/devtools-heap-snapshot-worker.js +9710 -7
- package/build/src/third_party/index.js +185093 -26
- package/build/src/tools/ToolDefinition.js +0 -1
- package/build/src/tools/opera.js +36 -5
- package/build/src/tools/thirdPartyDeveloper.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,11 +29,11 @@ When connected to Opera Neon, it also exposes Opera's built-in AI capabilities.
|
|
|
29
29
|
|
|
30
30
|
These tools are only available when connected to Opera Neon via `--browser-url`.
|
|
31
31
|
|
|
32
|
-
| Tool
|
|
33
|
-
|
|
34
|
-
| `opera_chat`
|
|
35
|
-
| `opera_do`
|
|
36
|
-
| `opera_make`
|
|
32
|
+
| Tool | Description |
|
|
33
|
+
| ---------------- | ------------------------------------------------------------------------------------------------------- |
|
|
34
|
+
| `opera_chat` | Send a chat prompt to Opera's built-in AI and return the response. |
|
|
35
|
+
| `opera_do` | Instruct Opera's built-in AI to perform an action on the current page. |
|
|
36
|
+
| `opera_make` | Ask Opera's built-in AI to create or generate content. |
|
|
37
37
|
| `opera_research` | Ask Opera's built-in AI to research a topic. Supports `local`, `one-minute`, and `deep` research modes. |
|
|
38
38
|
|
|
39
39
|
## Disclaimers
|
|
@@ -79,7 +79,11 @@ To use Opera Neon AI tools, start Opera Neon with remote debugging enabled and c
|
|
|
79
79
|
"mcpServers": {
|
|
80
80
|
"opera-devtools": {
|
|
81
81
|
"command": "npx",
|
|
82
|
-
"args": [
|
|
82
|
+
"args": [
|
|
83
|
+
"-y",
|
|
84
|
+
"opera-devtools-mcp@latest",
|
|
85
|
+
"--browser-url=http://127.0.0.1:9222"
|
|
86
|
+
]
|
|
83
87
|
}
|
|
84
88
|
}
|
|
85
89
|
}
|
|
@@ -151,12 +155,7 @@ If you run into any issues, checkout our [troubleshooting guide](./docs/troubles
|
|
|
151
155
|
|
|
152
156
|
<!-- BEGIN AUTO GENERATED TOOLS -->
|
|
153
157
|
|
|
154
|
-
- **
|
|
155
|
-
- `opera_chat`
|
|
156
|
-
- `opera_do`
|
|
157
|
-
- `opera_make`
|
|
158
|
-
- `opera_research`
|
|
159
|
-
- **Input automation** (9 tools)
|
|
158
|
+
- **Input automation** (10 tools)
|
|
160
159
|
- [`click`](docs/tool-reference.md#click)
|
|
161
160
|
- [`drag`](docs/tool-reference.md#drag)
|
|
162
161
|
- [`fill`](docs/tool-reference.md#fill)
|
|
@@ -166,6 +165,7 @@ If you run into any issues, checkout our [troubleshooting guide](./docs/troubles
|
|
|
166
165
|
- [`press_key`](docs/tool-reference.md#press_key)
|
|
167
166
|
- [`type_text`](docs/tool-reference.md#type_text)
|
|
168
167
|
- [`upload_file`](docs/tool-reference.md#upload_file)
|
|
168
|
+
- [`click_at`](docs/tool-reference.md#click_at)
|
|
169
169
|
- **Navigation automation** (6 tools)
|
|
170
170
|
- [`close_page`](docs/tool-reference.md#close_page)
|
|
171
171
|
- [`list_pages`](docs/tool-reference.md#list_pages)
|
|
@@ -176,21 +176,45 @@ If you run into any issues, checkout our [troubleshooting guide](./docs/troubles
|
|
|
176
176
|
- **Emulation** (2 tools)
|
|
177
177
|
- [`emulate`](docs/tool-reference.md#emulate)
|
|
178
178
|
- [`resize_page`](docs/tool-reference.md#resize_page)
|
|
179
|
-
- **Performance** (
|
|
179
|
+
- **Performance** (3 tools)
|
|
180
180
|
- [`performance_analyze_insight`](docs/tool-reference.md#performance_analyze_insight)
|
|
181
181
|
- [`performance_start_trace`](docs/tool-reference.md#performance_start_trace)
|
|
182
182
|
- [`performance_stop_trace`](docs/tool-reference.md#performance_stop_trace)
|
|
183
|
-
- [`take_memory_snapshot`](docs/tool-reference.md#take_memory_snapshot)
|
|
184
183
|
- **Network** (2 tools)
|
|
185
184
|
- [`get_network_request`](docs/tool-reference.md#get_network_request)
|
|
186
185
|
- [`list_network_requests`](docs/tool-reference.md#list_network_requests)
|
|
187
|
-
- **Debugging** (
|
|
186
|
+
- **Debugging** (8 tools)
|
|
188
187
|
- [`evaluate_script`](docs/tool-reference.md#evaluate_script)
|
|
189
188
|
- [`get_console_message`](docs/tool-reference.md#get_console_message)
|
|
190
189
|
- [`lighthouse_audit`](docs/tool-reference.md#lighthouse_audit)
|
|
191
190
|
- [`list_console_messages`](docs/tool-reference.md#list_console_messages)
|
|
192
191
|
- [`take_screenshot`](docs/tool-reference.md#take_screenshot)
|
|
193
192
|
- [`take_snapshot`](docs/tool-reference.md#take_snapshot)
|
|
193
|
+
- [`screencast_start`](docs/tool-reference.md#screencast_start)
|
|
194
|
+
- [`screencast_stop`](docs/tool-reference.md#screencast_stop)
|
|
195
|
+
- **Memory** (4 tools)
|
|
196
|
+
- [`take_memory_snapshot`](docs/tool-reference.md#take_memory_snapshot)
|
|
197
|
+
- [`get_memory_snapshot_details`](docs/tool-reference.md#get_memory_snapshot_details)
|
|
198
|
+
- [`get_nodes_by_class`](docs/tool-reference.md#get_nodes_by_class)
|
|
199
|
+
- [`load_memory_snapshot`](docs/tool-reference.md#load_memory_snapshot)
|
|
200
|
+
- **Opera** (5 tools)
|
|
201
|
+
- [`opera_chat`](docs/tool-reference.md#opera_chat)
|
|
202
|
+
- [`opera_do`](docs/tool-reference.md#opera_do)
|
|
203
|
+
- [`opera_list_models`](docs/tool-reference.md#opera_list_models)
|
|
204
|
+
- [`opera_make`](docs/tool-reference.md#opera_make)
|
|
205
|
+
- [`opera_research`](docs/tool-reference.md#opera_research)
|
|
206
|
+
- **Extensions** (5 tools)
|
|
207
|
+
- [`install_extension`](docs/tool-reference.md#install_extension)
|
|
208
|
+
- [`list_extensions`](docs/tool-reference.md#list_extensions)
|
|
209
|
+
- [`reload_extension`](docs/tool-reference.md#reload_extension)
|
|
210
|
+
- [`trigger_extension_action`](docs/tool-reference.md#trigger_extension_action)
|
|
211
|
+
- [`uninstall_extension`](docs/tool-reference.md#uninstall_extension)
|
|
212
|
+
- **Third-party** (2 tools)
|
|
213
|
+
- [`execute_3p_developer_tool`](docs/tool-reference.md#execute_3p_developer_tool)
|
|
214
|
+
- [`list_3p_developer_tools`](docs/tool-reference.md#list_3p_developer_tools)
|
|
215
|
+
- **WebMCP** (2 tools)
|
|
216
|
+
- [`execute_webmcp_tool`](docs/tool-reference.md#execute_webmcp_tool)
|
|
217
|
+
- [`list_webmcp_tools`](docs/tool-reference.md#list_webmcp_tools)
|
|
194
218
|
|
|
195
219
|
<!-- END AUTO GENERATED TOOLS -->
|
|
196
220
|
|
|
@@ -201,16 +225,16 @@ The Opera DevTools MCP server supports the following configuration options:
|
|
|
201
225
|
<!-- BEGIN AUTO GENERATED OPTIONS -->
|
|
202
226
|
|
|
203
227
|
- **`--autoConnect`/ `--auto-connect`**
|
|
204
|
-
If specified, automatically connects to a browser running locally from the user data directory identified by the channel param (default channel is stable).
|
|
228
|
+
If specified, automatically connects to a browser (Chrome 144+) running locally from the user data directory identified by the channel param (default channel is stable). Requires the remote debugging server to be started in the Chrome instance via chrome://inspect/#remote-debugging.
|
|
205
229
|
- **Type:** boolean
|
|
206
230
|
- **Default:** `false`
|
|
207
231
|
|
|
208
232
|
- **`--browserUrl`/ `--browser-url`, `-u`**
|
|
209
|
-
Connect to a running, debuggable
|
|
233
|
+
Connect to a running, debuggable Chrome instance (e.g. `http://127.0.0.1:9222`). For more details see: https://github.com/operasoftware/opera-devtools-mcp#connecting-to-a-running-chrome-instance.
|
|
210
234
|
- **Type:** string
|
|
211
235
|
|
|
212
236
|
- **`--wsEndpoint`/ `--ws-endpoint`, `-w`**
|
|
213
|
-
WebSocket endpoint to connect to a running
|
|
237
|
+
WebSocket endpoint to connect to a running Chrome instance (e.g., ws://127.0.0.1:9222/devtools/browser/<id>). Alternative to --browserUrl.
|
|
214
238
|
- **Type:** string
|
|
215
239
|
|
|
216
240
|
- **`--wsHeaders`/ `--ws-headers`**
|
|
@@ -223,32 +247,32 @@ The Opera DevTools MCP server supports the following configuration options:
|
|
|
223
247
|
- **Default:** `false`
|
|
224
248
|
|
|
225
249
|
- **`--executablePath`/ `--executable-path`, `-e`**
|
|
226
|
-
Path to custom
|
|
250
|
+
Path to custom Chrome executable.
|
|
227
251
|
- **Type:** string
|
|
228
252
|
|
|
229
253
|
- **`--isolated`**
|
|
230
|
-
If specified, creates a temporary user-data-dir that is automatically cleaned up after the browser is closed.
|
|
254
|
+
If specified, creates a temporary user-data-dir that is automatically cleaned up after the browser is closed. Defaults to false.
|
|
231
255
|
- **Type:** boolean
|
|
232
256
|
|
|
233
257
|
- **`--userDataDir`/ `--user-data-dir`**
|
|
234
|
-
Path to the user data directory for
|
|
258
|
+
Path to the user data directory for Chrome. Default is $HOME/.cache/opera-devtools-mcp/chrome-profile$CHANNEL_SUFFIX_IF_NON_STABLE
|
|
235
259
|
- **Type:** string
|
|
236
260
|
|
|
237
261
|
- **`--channel`**
|
|
238
|
-
Specify a different Chrome channel that should be used.
|
|
262
|
+
Specify a different Chrome channel that should be used. The default is the stable channel version.
|
|
239
263
|
- **Type:** string
|
|
240
|
-
- **Choices:** `
|
|
264
|
+
- **Choices:** `canary`, `dev`, `beta`, `stable`
|
|
241
265
|
|
|
242
266
|
- **`--logFile`/ `--log-file`**
|
|
243
|
-
Path to a file to write debug logs to.
|
|
267
|
+
Path to a file to write debug logs to. Set the env variable `DEBUG` to `*` to enable verbose logs. Useful for submitting bug reports.
|
|
244
268
|
- **Type:** string
|
|
245
269
|
|
|
246
270
|
- **`--viewport`**
|
|
247
|
-
Initial viewport size. For example, `1280x720`.
|
|
271
|
+
Initial viewport size for the Chrome instances started by the server. For example, `1280x720`. In headless mode, max size is 3840x2160px.
|
|
248
272
|
- **Type:** string
|
|
249
273
|
|
|
250
274
|
- **`--proxyServer`/ `--proxy-server`**
|
|
251
|
-
Proxy server configuration passed as --proxy-server when launching the browser.
|
|
275
|
+
Proxy server configuration for Chrome passed as --proxy-server when launching the browser. See https://www.chromium.org/developers/design-documents/network-settings/ for details.
|
|
252
276
|
- **Type:** string
|
|
253
277
|
|
|
254
278
|
- **`--acceptInsecureCerts`/ `--accept-insecure-certs`**
|
|
@@ -256,19 +280,27 @@ The Opera DevTools MCP server supports the following configuration options:
|
|
|
256
280
|
- **Type:** boolean
|
|
257
281
|
|
|
258
282
|
- **`--experimentalVision`/ `--experimental-vision`**
|
|
259
|
-
Whether to enable coordinate-based tools such as click_at(x,y).
|
|
283
|
+
Whether to enable coordinate-based tools such as click_at(x,y). Usually requires a computer-use model able to produce accurate coordinates by looking at screenshots.
|
|
260
284
|
- **Type:** boolean
|
|
261
285
|
|
|
262
286
|
- **`--experimentalScreencast`/ `--experimental-screencast`**
|
|
263
|
-
Exposes experimental screencast tools (requires ffmpeg).
|
|
287
|
+
Exposes experimental screencast tools (requires ffmpeg). Install ffmpeg https://www.ffmpeg.org/download.html and ensure it is available in the MCP server PATH.
|
|
288
|
+
- **Type:** boolean
|
|
289
|
+
|
|
290
|
+
- **`--experimentalFfmpegPath`/ `--experimental-ffmpeg-path`**
|
|
291
|
+
Path to ffmpeg executable for screencast recording.
|
|
292
|
+
- **Type:** string
|
|
293
|
+
|
|
294
|
+
- **`--categoryExperimentalWebmcp`/ `--category-experimental-webmcp`**
|
|
295
|
+
Set to true to enable debugging WebMCP tools. Requires Chrome 149+ with the following flags: `--enable-features=WebMCPTesting,DevToolsWebMCPSupport`
|
|
264
296
|
- **Type:** boolean
|
|
265
297
|
|
|
266
298
|
- **`--chromeArg`/ `--chrome-arg`**
|
|
267
|
-
Additional arguments for
|
|
299
|
+
Additional arguments for Chrome. Only applies when Chrome is launched by opera-devtools-mcp.
|
|
268
300
|
- **Type:** array
|
|
269
301
|
|
|
270
302
|
- **`--ignoreDefaultChromeArg`/ `--ignore-default-chrome-arg`**
|
|
271
|
-
Explicitly disable default arguments for
|
|
303
|
+
Explicitly disable default arguments for Chrome. Only applies when Chrome is launched by opera-devtools-mcp.
|
|
272
304
|
- **Type:** array
|
|
273
305
|
|
|
274
306
|
- **`--categoryEmulation`/ `--category-emulation`**
|
|
@@ -286,15 +318,35 @@ The Opera DevTools MCP server supports the following configuration options:
|
|
|
286
318
|
- **Type:** boolean
|
|
287
319
|
- **Default:** `true`
|
|
288
320
|
|
|
321
|
+
- **`--categoryExtensions`/ `--category-extensions`**
|
|
322
|
+
Set to true to include tools related to extensions. Note: This feature is currently only supported with a pipe connection. autoConnect, browserUrl, and wsEndpoint are not supported with this feature until 149 will be released.
|
|
323
|
+
- **Type:** boolean
|
|
324
|
+
- **Default:** `false`
|
|
325
|
+
|
|
326
|
+
- **`--categoryExperimentalThirdParty`/ `--category-experimental-third-party`**
|
|
327
|
+
Set to true to enable third-party developer tools exposed by the inspected page itself
|
|
328
|
+
- **Type:** boolean
|
|
329
|
+
- **Default:** `false`
|
|
330
|
+
|
|
289
331
|
- **`--performanceCrux`/ `--performance-crux`**
|
|
290
|
-
Set to
|
|
332
|
+
Set to true to enable sending URLs from performance traces to CrUX API to get field performance data.
|
|
291
333
|
- **Type:** boolean
|
|
292
|
-
- **Default:** `
|
|
334
|
+
- **Default:** `false`
|
|
335
|
+
|
|
336
|
+
- **`--usageStatistics`/ `--usage-statistics`**
|
|
337
|
+
Set to true to opt-in to usage statistics collection. Google collects usage data to improve the tool, handled under the Google Privacy Policy (https://policies.google.com/privacy). This is independent from Chrome browser metrics. Disabled if `OPERA_DEVTOOLS_NO_USAGE_STATISTICS` or `CI` env variables are set.
|
|
338
|
+
- **Type:** boolean
|
|
339
|
+
- **Default:** `false`
|
|
293
340
|
|
|
294
341
|
- **`--slim`**
|
|
295
|
-
Exposes a "slim" set of 3 tools covering navigation, script execution and screenshots only.
|
|
342
|
+
Exposes a "slim" set of 3 tools covering navigation, script execution and screenshots only. Useful for basic browser tasks.
|
|
296
343
|
- **Type:** boolean
|
|
297
344
|
|
|
345
|
+
- **`--redactNetworkHeaders`/ `--redact-network-headers`**
|
|
346
|
+
If true, redacts some of the network headers considered senstive before returning to the client.
|
|
347
|
+
- **Type:** boolean
|
|
348
|
+
- **Default:** `false`
|
|
349
|
+
|
|
298
350
|
<!-- END AUTO GENERATED OPTIONS -->
|
|
299
351
|
|
|
300
352
|
Pass them via the `args` property in the JSON configuration. For example:
|
|
@@ -105,9 +105,12 @@ export class WaitForHelper {
|
|
|
105
105
|
}
|
|
106
106
|
async waitForEventsAfterAction(action, options) {
|
|
107
107
|
let dialogOpened = false;
|
|
108
|
+
const dialogWatcher = () => {
|
|
109
|
+
dialogOpened = true;
|
|
110
|
+
};
|
|
111
|
+
this.#page.on('dialog', dialogWatcher);
|
|
108
112
|
if (options?.handleDialog) {
|
|
109
113
|
const dialogHandler = (dialog) => {
|
|
110
|
-
dialogOpened = true;
|
|
111
114
|
if (options.handleDialog === 'dismiss') {
|
|
112
115
|
void dialog.dismiss();
|
|
113
116
|
}
|
|
@@ -123,6 +126,9 @@ export class WaitForHelper {
|
|
|
123
126
|
this.#page.off('dialog', dialogHandler);
|
|
124
127
|
});
|
|
125
128
|
}
|
|
129
|
+
this.#abortController.signal.addEventListener('abort', () => {
|
|
130
|
+
this.#page.off('dialog', dialogWatcher);
|
|
131
|
+
});
|
|
126
132
|
const urlBeforeAction = this.#page.url();
|
|
127
133
|
const navigationFinished = this.waitForNavigationStarted()
|
|
128
134
|
.then(navigationStated => {
|
|
@@ -149,7 +155,8 @@ export class WaitForHelper {
|
|
|
149
155
|
return {};
|
|
150
156
|
}
|
|
151
157
|
// Wait for stable dom after navigation so we execute in
|
|
152
|
-
// the correct context
|
|
158
|
+
// the correct context. Skip if a dialog opened during the action
|
|
159
|
+
// since JS is paused and evaluateHandle would hang.
|
|
153
160
|
await this.waitForStableDom();
|
|
154
161
|
}
|
|
155
162
|
catch (error) {
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* @license
|
|
3
3
|
* Copyright 2026 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*
|
|
6
|
+
* Modified by Opera Software AS.
|
|
5
7
|
*/
|
|
6
8
|
export const commands = {
|
|
7
9
|
click: {
|
|
@@ -28,36 +30,6 @@ export const commands = {
|
|
|
28
30
|
},
|
|
29
31
|
},
|
|
30
32
|
},
|
|
31
|
-
click_at: {
|
|
32
|
-
description: 'Clicks at the provided coordinates (requires flag: --experimentalVision=true)',
|
|
33
|
-
category: 'Input automation',
|
|
34
|
-
args: {
|
|
35
|
-
x: {
|
|
36
|
-
name: 'x',
|
|
37
|
-
type: 'number',
|
|
38
|
-
description: 'The x coordinate',
|
|
39
|
-
required: true,
|
|
40
|
-
},
|
|
41
|
-
y: {
|
|
42
|
-
name: 'y',
|
|
43
|
-
type: 'number',
|
|
44
|
-
description: 'The y coordinate',
|
|
45
|
-
required: true,
|
|
46
|
-
},
|
|
47
|
-
dblClick: {
|
|
48
|
-
name: 'dblClick',
|
|
49
|
-
type: 'boolean',
|
|
50
|
-
description: 'Set to true for double clicks. Default is false.',
|
|
51
|
-
required: false,
|
|
52
|
-
},
|
|
53
|
-
includeSnapshot: {
|
|
54
|
-
name: 'includeSnapshot',
|
|
55
|
-
type: 'boolean',
|
|
56
|
-
description: 'Whether to include a snapshot in the response. Default is false.',
|
|
57
|
-
required: false,
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
33
|
close_page: {
|
|
62
34
|
description: 'Closes the page by its index. The last open page cannot be closed.',
|
|
63
35
|
category: 'Navigation automation',
|
|
@@ -162,42 +134,6 @@ export const commands = {
|
|
|
162
134
|
},
|
|
163
135
|
},
|
|
164
136
|
},
|
|
165
|
-
execute_3p_developer_tool: {
|
|
166
|
-
description: 'Executes a tool exposed by the page. (requires flag: --categoryExperimentalThirdParty=true)',
|
|
167
|
-
category: 'Third-party',
|
|
168
|
-
args: {
|
|
169
|
-
toolName: {
|
|
170
|
-
name: 'toolName',
|
|
171
|
-
type: 'string',
|
|
172
|
-
description: 'The name of the tool to execute',
|
|
173
|
-
required: true,
|
|
174
|
-
},
|
|
175
|
-
params: {
|
|
176
|
-
name: 'params',
|
|
177
|
-
type: 'string',
|
|
178
|
-
description: 'The JSON-stringified parameters to pass to the tool',
|
|
179
|
-
required: false,
|
|
180
|
-
},
|
|
181
|
-
},
|
|
182
|
-
},
|
|
183
|
-
execute_webmcp_tool: {
|
|
184
|
-
description: 'Executes a WebMCP tool exposed by the page. (requires flag: --categoryExperimentalWebmcp=true)',
|
|
185
|
-
category: 'WebMCP',
|
|
186
|
-
args: {
|
|
187
|
-
toolName: {
|
|
188
|
-
name: 'toolName',
|
|
189
|
-
type: 'string',
|
|
190
|
-
description: 'The name of the WebMCP tool to execute',
|
|
191
|
-
required: true,
|
|
192
|
-
},
|
|
193
|
-
input: {
|
|
194
|
-
name: 'input',
|
|
195
|
-
type: 'string',
|
|
196
|
-
description: 'The JSON-stringified parameters to pass to the WebMCP tool',
|
|
197
|
-
required: false,
|
|
198
|
-
},
|
|
199
|
-
},
|
|
200
|
-
},
|
|
201
137
|
fill: {
|
|
202
138
|
description: 'Type text into an input, text area or select an option from a <select> element.',
|
|
203
139
|
category: 'Input automation',
|
|
@@ -234,30 +170,6 @@ export const commands = {
|
|
|
234
170
|
},
|
|
235
171
|
},
|
|
236
172
|
},
|
|
237
|
-
get_memory_snapshot_details: {
|
|
238
|
-
description: 'Loads a memory heapsnapshot and returns all available information including statistics, static data, and aggregated node information. Supports pagination for aggregates. (requires flag: --experimentalMemory=true)',
|
|
239
|
-
category: 'Memory',
|
|
240
|
-
args: {
|
|
241
|
-
filePath: {
|
|
242
|
-
name: 'filePath',
|
|
243
|
-
type: 'string',
|
|
244
|
-
description: 'A path to a .heapsnapshot file to read.',
|
|
245
|
-
required: true,
|
|
246
|
-
},
|
|
247
|
-
pageIdx: {
|
|
248
|
-
name: 'pageIdx',
|
|
249
|
-
type: 'number',
|
|
250
|
-
description: 'The page index for pagination of aggregates.',
|
|
251
|
-
required: false,
|
|
252
|
-
},
|
|
253
|
-
pageSize: {
|
|
254
|
-
name: 'pageSize',
|
|
255
|
-
type: 'number',
|
|
256
|
-
description: 'The page size for pagination of aggregates.',
|
|
257
|
-
required: false,
|
|
258
|
-
},
|
|
259
|
-
},
|
|
260
|
-
},
|
|
261
173
|
get_network_request: {
|
|
262
174
|
description: 'Gets a network request by an optional reqid, if omitted returns the currently selected request in the DevTools Network panel.',
|
|
263
175
|
category: 'Network',
|
|
@@ -282,36 +194,6 @@ export const commands = {
|
|
|
282
194
|
},
|
|
283
195
|
},
|
|
284
196
|
},
|
|
285
|
-
get_nodes_by_class: {
|
|
286
|
-
description: 'Loads a memory heapsnapshot and returns instances of a specific class with their stable IDs. (requires flag: --experimentalMemory=true)',
|
|
287
|
-
category: 'Memory',
|
|
288
|
-
args: {
|
|
289
|
-
filePath: {
|
|
290
|
-
name: 'filePath',
|
|
291
|
-
type: 'string',
|
|
292
|
-
description: 'A path to a .heapsnapshot file to read.',
|
|
293
|
-
required: true,
|
|
294
|
-
},
|
|
295
|
-
uid: {
|
|
296
|
-
name: 'uid',
|
|
297
|
-
type: 'number',
|
|
298
|
-
description: 'The unique UID for the class, obtained from aggregates listing.',
|
|
299
|
-
required: true,
|
|
300
|
-
},
|
|
301
|
-
pageIdx: {
|
|
302
|
-
name: 'pageIdx',
|
|
303
|
-
type: 'number',
|
|
304
|
-
description: 'The page index for pagination.',
|
|
305
|
-
required: false,
|
|
306
|
-
},
|
|
307
|
-
pageSize: {
|
|
308
|
-
name: 'pageSize',
|
|
309
|
-
type: 'number',
|
|
310
|
-
description: 'The page size for pagination.',
|
|
311
|
-
required: false,
|
|
312
|
-
},
|
|
313
|
-
},
|
|
314
|
-
},
|
|
315
197
|
handle_dialog: {
|
|
316
198
|
description: 'If a browser dialog was opened, use this command to handle it',
|
|
317
199
|
category: 'Input automation',
|
|
@@ -349,18 +231,6 @@ export const commands = {
|
|
|
349
231
|
},
|
|
350
232
|
},
|
|
351
233
|
},
|
|
352
|
-
install_extension: {
|
|
353
|
-
description: 'Installs a Chrome extension from the given path. (requires flag: --categoryExtensions=true)',
|
|
354
|
-
category: 'Extensions',
|
|
355
|
-
args: {
|
|
356
|
-
path: {
|
|
357
|
-
name: 'path',
|
|
358
|
-
type: 'string',
|
|
359
|
-
description: 'Absolute path to the unpacked extension folder.',
|
|
360
|
-
required: true,
|
|
361
|
-
},
|
|
362
|
-
},
|
|
363
|
-
},
|
|
364
234
|
lighthouse_audit: {
|
|
365
235
|
description: 'Get Lighthouse score and reports for accessibility, SEO, best practices, and agentic browsing. This excludes performance. For performance audits, run performance_start_trace',
|
|
366
236
|
category: 'Debugging',
|
|
@@ -389,11 +259,6 @@ export const commands = {
|
|
|
389
259
|
},
|
|
390
260
|
},
|
|
391
261
|
},
|
|
392
|
-
list_3p_developer_tools: {
|
|
393
|
-
description: "Lists all third-party developer tools the page exposes for providing runtime information.\n Third-party developer tools can be called via the 'execute_3p_developer_tool()' MCP tool.\n Alternatively, third-party developer tools can be executed by calling 'evaluate_script' and adding the\n following command to the script:\n 'window.__dtmcp.executeTool(toolName, params)'\n This might be helpful when the third-party developer tools return non-serializable values or when composing\n third-party developer tools with additional functionality. (requires flag: --categoryExperimentalThirdParty=true)",
|
|
394
|
-
category: 'Third-party',
|
|
395
|
-
args: {},
|
|
396
|
-
},
|
|
397
262
|
list_console_messages: {
|
|
398
263
|
description: 'List all console messages for the currently selected page since the last navigation.',
|
|
399
264
|
category: 'Debugging',
|
|
@@ -425,11 +290,6 @@ export const commands = {
|
|
|
425
290
|
},
|
|
426
291
|
},
|
|
427
292
|
},
|
|
428
|
-
list_extensions: {
|
|
429
|
-
description: 'Lists all the Chrome extensions installed in the browser. This includes their name, ID, version, and enabled status. (requires flag: --categoryExtensions=true)',
|
|
430
|
-
category: 'Extensions',
|
|
431
|
-
args: {},
|
|
432
|
-
},
|
|
433
293
|
list_network_requests: {
|
|
434
294
|
description: 'List all requests for the currently selected page since the last navigation.',
|
|
435
295
|
category: 'Network',
|
|
@@ -466,23 +326,6 @@ export const commands = {
|
|
|
466
326
|
category: 'Navigation automation',
|
|
467
327
|
args: {},
|
|
468
328
|
},
|
|
469
|
-
list_webmcp_tools: {
|
|
470
|
-
description: 'Lists all WebMCP tools the page exposes. (requires flag: --categoryExperimentalWebmcp=true)',
|
|
471
|
-
category: 'WebMCP',
|
|
472
|
-
args: {},
|
|
473
|
-
},
|
|
474
|
-
load_memory_snapshot: {
|
|
475
|
-
description: 'Loads a memory heapsnapshot and returns snapshot summary stats. (requires flag: --experimentalMemory=true)',
|
|
476
|
-
category: 'Memory',
|
|
477
|
-
args: {
|
|
478
|
-
filePath: {
|
|
479
|
-
name: 'filePath',
|
|
480
|
-
type: 'string',
|
|
481
|
-
description: 'A path to a .heapsnapshot file to read.',
|
|
482
|
-
required: true,
|
|
483
|
-
},
|
|
484
|
-
},
|
|
485
|
-
},
|
|
486
329
|
navigate_page: {
|
|
487
330
|
description: 'Go to a URL, or back, forward, or reload. Use project URL if not specified otherwise.',
|
|
488
331
|
category: 'Navigation automation',
|
|
@@ -557,6 +400,72 @@ export const commands = {
|
|
|
557
400
|
},
|
|
558
401
|
},
|
|
559
402
|
},
|
|
403
|
+
opera_chat: {
|
|
404
|
+
description: "Send a chat prompt to Opera's built-in AI and return the response. Only available when connected to Opera Neon.",
|
|
405
|
+
category: 'Opera',
|
|
406
|
+
args: {
|
|
407
|
+
prompt: {
|
|
408
|
+
name: 'prompt',
|
|
409
|
+
type: 'string',
|
|
410
|
+
description: 'The prompt to send to Opera AI.',
|
|
411
|
+
required: true,
|
|
412
|
+
},
|
|
413
|
+
model: {
|
|
414
|
+
name: 'model',
|
|
415
|
+
type: 'string',
|
|
416
|
+
description: 'Model ID to use for the chat. Omit to use the browser default. Use opera_list_models to discover available IDs.',
|
|
417
|
+
required: false,
|
|
418
|
+
},
|
|
419
|
+
},
|
|
420
|
+
},
|
|
421
|
+
opera_do: {
|
|
422
|
+
description: "Instruct Opera's built-in AI to perform an action on the current page and return the result. Only available when connected to Opera Neon.",
|
|
423
|
+
category: 'Opera',
|
|
424
|
+
args: {
|
|
425
|
+
prompt: {
|
|
426
|
+
name: 'prompt',
|
|
427
|
+
type: 'string',
|
|
428
|
+
description: 'The action to perform, described in natural language.',
|
|
429
|
+
required: true,
|
|
430
|
+
},
|
|
431
|
+
},
|
|
432
|
+
},
|
|
433
|
+
opera_list_models: {
|
|
434
|
+
description: 'List available AI models for Opera chat. Returns model IDs, display names, and which is the default. Only available when connected to Opera Neon.',
|
|
435
|
+
category: 'Opera',
|
|
436
|
+
args: {},
|
|
437
|
+
},
|
|
438
|
+
opera_make: {
|
|
439
|
+
description: "Ask Opera's built-in AI to create or generate content and return the result. Only available when connected to Opera Neon.",
|
|
440
|
+
category: 'Opera',
|
|
441
|
+
args: {
|
|
442
|
+
prompt: {
|
|
443
|
+
name: 'prompt',
|
|
444
|
+
type: 'string',
|
|
445
|
+
description: 'Description of what to create or generate.',
|
|
446
|
+
required: true,
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
},
|
|
450
|
+
opera_research: {
|
|
451
|
+
description: "Ask Opera's built-in AI to research a topic and return a summary. Only available when connected to Opera Neon.",
|
|
452
|
+
category: 'Opera',
|
|
453
|
+
args: {
|
|
454
|
+
prompt: {
|
|
455
|
+
name: 'prompt',
|
|
456
|
+
type: 'string',
|
|
457
|
+
description: 'The topic or question to research.',
|
|
458
|
+
required: true,
|
|
459
|
+
},
|
|
460
|
+
researchType: {
|
|
461
|
+
name: 'researchType',
|
|
462
|
+
type: 'string',
|
|
463
|
+
description: 'Depth of research. "local" uses only on-page context, "one-minute" performs a quick web search, "deep" performs a thorough multi-source search.',
|
|
464
|
+
required: false,
|
|
465
|
+
enum: ['local', 'one-minute', 'deep'],
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
},
|
|
560
469
|
performance_analyze_insight: {
|
|
561
470
|
description: 'Provides more detailed information on a specific Performance Insight of an insight set that was highlighted in the results of a trace recording.',
|
|
562
471
|
category: 'Performance',
|
|
@@ -631,18 +540,6 @@ export const commands = {
|
|
|
631
540
|
},
|
|
632
541
|
},
|
|
633
542
|
},
|
|
634
|
-
reload_extension: {
|
|
635
|
-
description: 'Reloads an unpacked Chrome extension by its ID. (requires flag: --categoryExtensions=true)',
|
|
636
|
-
category: 'Extensions',
|
|
637
|
-
args: {
|
|
638
|
-
id: {
|
|
639
|
-
name: 'id',
|
|
640
|
-
type: 'string',
|
|
641
|
-
description: 'ID of the extension to reload.',
|
|
642
|
-
required: true,
|
|
643
|
-
},
|
|
644
|
-
},
|
|
645
|
-
},
|
|
646
543
|
resize_page: {
|
|
647
544
|
description: "Resizes the selected page's window so that the page has specified dimension",
|
|
648
545
|
category: 'Emulation',
|
|
@@ -661,23 +558,6 @@ export const commands = {
|
|
|
661
558
|
},
|
|
662
559
|
},
|
|
663
560
|
},
|
|
664
|
-
screencast_start: {
|
|
665
|
-
description: 'Starts recording a screencast (video) of the selected page in specified format. (requires flag: --experimentalScreencast=true)',
|
|
666
|
-
category: 'Debugging',
|
|
667
|
-
args: {
|
|
668
|
-
filePath: {
|
|
669
|
-
name: 'filePath',
|
|
670
|
-
type: 'string',
|
|
671
|
-
description: 'Output file path (.webm,.mp4 are supported). Uses mkdtemp to generate a unique path if not provided.',
|
|
672
|
-
required: false,
|
|
673
|
-
},
|
|
674
|
-
},
|
|
675
|
-
},
|
|
676
|
-
screencast_stop: {
|
|
677
|
-
description: 'Stops the active screencast recording on the selected page. (requires flag: --experimentalScreencast=true)',
|
|
678
|
-
category: 'Debugging',
|
|
679
|
-
args: {},
|
|
680
|
-
},
|
|
681
561
|
select_page: {
|
|
682
562
|
description: 'Select a page as a context for future tool calls.',
|
|
683
563
|
category: 'Navigation automation',
|
|
@@ -764,18 +644,6 @@ export const commands = {
|
|
|
764
644
|
},
|
|
765
645
|
},
|
|
766
646
|
},
|
|
767
|
-
trigger_extension_action: {
|
|
768
|
-
description: 'Triggers the default action of an extension by its ID. (requires flag: --categoryExtensions=true)',
|
|
769
|
-
category: 'Extensions',
|
|
770
|
-
args: {
|
|
771
|
-
id: {
|
|
772
|
-
name: 'id',
|
|
773
|
-
type: 'string',
|
|
774
|
-
description: 'ID of the extension to trigger the action for.',
|
|
775
|
-
required: true,
|
|
776
|
-
},
|
|
777
|
-
},
|
|
778
|
-
},
|
|
779
647
|
type_text: {
|
|
780
648
|
description: 'Type text using keyboard into a previously focused input',
|
|
781
649
|
category: 'Input automation',
|
|
@@ -794,18 +662,6 @@ export const commands = {
|
|
|
794
662
|
},
|
|
795
663
|
},
|
|
796
664
|
},
|
|
797
|
-
uninstall_extension: {
|
|
798
|
-
description: 'Uninstalls a Chrome extension by its ID. (requires flag: --categoryExtensions=true)',
|
|
799
|
-
category: 'Extensions',
|
|
800
|
-
args: {
|
|
801
|
-
id: {
|
|
802
|
-
name: 'id',
|
|
803
|
-
type: 'string',
|
|
804
|
-
description: 'ID of the extension to uninstall.',
|
|
805
|
-
required: true,
|
|
806
|
-
},
|
|
807
|
-
},
|
|
808
|
-
},
|
|
809
665
|
upload_file: {
|
|
810
666
|
description: 'Upload a file through a provided element.',
|
|
811
667
|
category: 'Input automation',
|
|
@@ -30,7 +30,7 @@ if (process.env['OPERA_DEVTOOLS_CRASH_ON_UNCAUGHT'] !== 'true') {
|
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
32
|
logger(`Starting Opera DevTools MCP Server v${VERSION}`);
|
|
33
|
-
const { server
|
|
33
|
+
const { server } = await createMcpServer(args, {
|
|
34
34
|
logFile,
|
|
35
35
|
});
|
|
36
36
|
const transport = new StdioServerTransport();
|