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 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 | 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. |
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": ["-y", "opera-devtools-mcp@latest", "--browser-url=http://127.0.0.1:9222"]
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
- - **Opera Neon AI** (4 tools, Opera Neon only)
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** (4 tools)
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** (6 tools)
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 browser instance (e.g. `http://127.0.0.1:9222`).
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 browser instance (e.g., ws://127.0.0.1:9222/devtools/browser/<id>). Alternative to --browserUrl.
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 browser executable.
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 the browser.
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:** `stable`, `canary`, `beta`, `dev`
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 the browser. Only applies when the browser is launched by opera-devtools-mcp.
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 the browser.
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 false to disable sending URLs from performance traces to CrUX API to get field performance data.
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:** `true`
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, clearcutLogger } = await createMcpServer(args, {
33
+ const { server } = await createMcpServer(args, {
34
34
  logFile,
35
35
  });
36
36
  const transport = new StdioServerTransport();