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.
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Modified by Opera Software AS.
7
7
  */
8
- import { closeBrowserIfOpen, ensureBrowserConnected, ensureBrowserLaunched, getCurrentBrowser } from './browser.js';
8
+ import { closeBrowserIfOpen, ensureBrowserConnected, ensureBrowserLaunched, getCurrentBrowser, } from './browser.js';
9
9
  import { loadIssueDescriptions } from './issue-descriptions.js';
10
10
  import { logger } from './logger.js';
11
11
  import { McpContext } from './McpContext.js';
@@ -200,7 +200,8 @@ export async function createMcpServer(serverArgs, options) {
200
200
  const needsOperaFlags = tool.name === 'opera_do' || tool.name === 'opera_research';
201
201
  const browserConnected = getCurrentBrowser()?.connected ?? false;
202
202
  if (isLaunchMode) {
203
- if (needsOperaFlags && !(browserHasOperaFlags && browserConnected)) {
203
+ if (needsOperaFlags &&
204
+ !(browserHasOperaFlags && browserConnected)) {
204
205
  await restartBrowserForOpera();
205
206
  }
206
207
  else if (!needsOperaFlags &&
@@ -220,37 +221,52 @@ export async function createMcpServer(serverArgs, options) {
220
221
  // VS Code, etc.) continue to render it as readable text.
221
222
  void extra.sendNotification({
222
223
  method: 'notifications/message',
223
- params: { level: 'info', data: message, logger: String(extra.requestId) },
224
+ params: {
225
+ level: 'info',
226
+ data: message,
227
+ logger: String(extra.requestId),
228
+ },
224
229
  });
225
230
  };
226
231
  const response = serverArgs.slim
227
232
  ? new SlimMcpResponse(serverArgs, logCallback)
228
233
  : new McpResponse(serverArgs, logCallback);
229
- if ('pageScoped' in tool && tool.pageScoped) {
230
- const page = serverArgs.experimentalPageIdRouting &&
231
- params.pageId &&
232
- !serverArgs.slim
233
- ? context.getPageById(params.pageId)
234
- : context.getSelectedMcpPage();
235
- response.setPage(page);
236
- await tool.handler({
237
- params,
238
- page,
239
- signal: extra.signal,
240
- }, response, context);
234
+ try {
235
+ if ('pageScoped' in tool && tool.pageScoped) {
236
+ const page = serverArgs.experimentalPageIdRouting &&
237
+ params.pageId &&
238
+ !serverArgs.slim
239
+ ? context.getPageById(params.pageId)
240
+ : context.getSelectedMcpPage();
241
+ response.setPage(page);
242
+ if (tool.blockedByDialog) {
243
+ page.throwIfDialogOpen();
244
+ }
245
+ await tool.handler({
246
+ params,
247
+ page,
248
+ signal: extra.signal,
249
+ }, response, context);
250
+ }
251
+ else {
252
+ await tool.handler(
253
+ // @ts-expect-error types do not match.
254
+ {
255
+ params,
256
+ signal: extra.signal,
257
+ }, response, context);
258
+ }
241
259
  }
242
- else {
243
- await tool.handler(
244
- // @ts-expect-error types do not match.
245
- {
246
- params,
247
- signal: extra.signal,
248
- }, response, context);
260
+ catch (err) {
261
+ response.setError(err);
249
262
  }
250
263
  const { content, structuredContent } = await response.handle(tool.name, context);
251
264
  const result = {
252
265
  content,
253
266
  };
267
+ if (response.error) {
268
+ result.isError = true;
269
+ }
254
270
  success = true;
255
271
  if (serverArgs.experimentalStructuredContent) {
256
272
  result.structuredContent = structuredContent;