chrome-devtools-mcp 0.23.0 → 0.25.0

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.
Files changed (83) hide show
  1. package/README.md +22 -5
  2. package/build/src/DevToolsConnectionAdapter.js +1 -0
  3. package/build/src/DevtoolsUtils.js +1 -0
  4. package/build/src/HeapSnapshotManager.js +16 -0
  5. package/build/src/McpContext.js +57 -4
  6. package/build/src/McpPage.js +10 -4
  7. package/build/src/McpResponse.js +55 -19
  8. package/build/src/Mutex.js +1 -0
  9. package/build/src/PageCollector.js +1 -0
  10. package/build/src/SlimMcpResponse.js +1 -0
  11. package/build/src/TextSnapshot.js +13 -7
  12. package/build/src/WaitForHelper.js +6 -0
  13. package/build/src/bin/check-latest-version.js +1 -0
  14. package/build/src/bin/chrome-devtools-cli-options.js +229 -46
  15. package/build/src/bin/chrome-devtools-mcp-cli-options.js +10 -5
  16. package/build/src/bin/chrome-devtools-mcp-main.js +1 -5
  17. package/build/src/bin/chrome-devtools-mcp.js +1 -0
  18. package/build/src/bin/chrome-devtools.js +5 -13
  19. package/build/src/browser.js +1 -0
  20. package/build/src/daemon/client.js +4 -2
  21. package/build/src/daemon/daemon.js +1 -0
  22. package/build/src/daemon/types.js +1 -0
  23. package/build/src/daemon/utils.js +1 -0
  24. package/build/src/formatters/ConsoleFormatter.js +48 -1
  25. package/build/src/formatters/HeapSnapshotFormatter.js +18 -2
  26. package/build/src/formatters/IssueFormatter.js +1 -0
  27. package/build/src/formatters/NetworkFormatter.js +1 -0
  28. package/build/src/formatters/SnapshotFormatter.js +2 -1
  29. package/build/src/index.js +114 -51
  30. package/build/src/issue-descriptions.js +1 -0
  31. package/build/src/logger.js +1 -0
  32. package/build/src/polyfill.js +1 -0
  33. package/build/src/telemetry/ClearcutLogger.js +13 -1
  34. package/build/src/telemetry/WatchdogClient.js +1 -0
  35. package/build/src/telemetry/flagUtils.js +1 -0
  36. package/build/src/telemetry/metricUtils.js +1 -0
  37. package/build/src/telemetry/persistence.js +1 -0
  38. package/build/src/telemetry/toolMetricsUtils.js +2 -1
  39. package/build/src/telemetry/types.js +1 -0
  40. package/build/src/telemetry/watchdog/ClearcutSender.js +1 -0
  41. package/build/src/telemetry/watchdog/main.js +1 -0
  42. package/build/src/third_party/THIRD_PARTY_NOTICES +8 -8
  43. package/build/src/third_party/bundled-packages.json +3 -3
  44. package/build/src/third_party/devtools-formatter-worker.js +2469 -2933
  45. package/build/src/third_party/devtools-heap-snapshot-worker.js +50 -26
  46. package/build/src/third_party/index.js +1107 -407
  47. package/build/src/third_party/issue-descriptions/genericFormModelContextMissingToolDescription.md +5 -0
  48. package/build/src/third_party/issue-descriptions/genericFormModelContextMissingToolName.md +5 -0
  49. package/build/src/third_party/issue-descriptions/genericFormModelContextParameterMissingName.md +5 -0
  50. package/build/src/third_party/issue-descriptions/genericFormModelContextParameterMissingTitleAndDescription.md +5 -0
  51. package/build/src/third_party/issue-descriptions/genericFormModelContextRequiredParameterMissingName.md +5 -0
  52. package/build/src/third_party/lighthouse-devtools-mcp-bundle.js +21717 -20261
  53. package/build/src/tools/ToolDefinition.js +1 -0
  54. package/build/src/tools/categories.js +10 -3
  55. package/build/src/tools/console.js +3 -0
  56. package/build/src/tools/emulation.js +2 -0
  57. package/build/src/tools/extensions.js +6 -0
  58. package/build/src/tools/input.js +57 -2
  59. package/build/src/tools/lighthouse.js +17 -9
  60. package/build/src/tools/memory.js +34 -1
  61. package/build/src/tools/network.js +5 -0
  62. package/build/src/tools/pages.js +14 -5
  63. package/build/src/tools/performance.js +6 -0
  64. package/build/src/tools/screencast.js +6 -2
  65. package/build/src/tools/screenshot.js +3 -0
  66. package/build/src/tools/script.js +2 -0
  67. package/build/src/tools/slim/tools.js +4 -0
  68. package/build/src/tools/snapshot.js +5 -1
  69. package/build/src/tools/{inPage.js → thirdPartyDeveloper.js} +17 -16
  70. package/build/src/tools/tools.js +3 -2
  71. package/build/src/tools/webmcp.js +5 -4
  72. package/build/src/trace-processing/parse.js +1 -0
  73. package/build/src/types.js +1 -0
  74. package/build/src/utils/check-for-updates.js +1 -0
  75. package/build/src/utils/files.js +5 -10
  76. package/build/src/utils/id.js +1 -0
  77. package/build/src/utils/keyboard.js +1 -0
  78. package/build/src/utils/pagination.js +1 -0
  79. package/build/src/utils/string.js +1 -0
  80. package/build/src/utils/types.js +1 -0
  81. package/build/src/version.js +2 -1
  82. package/package.json +10 -11
  83. package/build/src/bin/cliDefinitions.js +0 -621
@@ -67,8 +67,8 @@ const EmptyUrlString = '';
67
67
 
68
68
  // Copyright 2025 The Chromium Authors
69
69
  class WebWorkerScope {
70
- postMessage(message) {
71
- self.postMessage(message);
70
+ postMessage(message, transfer) {
71
+ self.postMessage(message, transfer);
72
72
  }
73
73
  set onmessage(listener) {
74
74
  self.addEventListener('message', listener);
@@ -125,6 +125,15 @@ const HOST_RUNTIME$2 = {
125
125
  return new WebWorker(url);
126
126
  },
127
127
  workerScope: new WebWorkerScope(),
128
+ getOnLine() {
129
+ return navigator.onLine;
130
+ },
131
+ getUserAgent() {
132
+ return navigator.userAgent;
133
+ },
134
+ getLocalStorage() {
135
+ return 'localStorage' in globalThis ? globalThis.localStorage : undefined;
136
+ },
128
137
  };
129
138
 
130
139
  var HostRuntime$1 = /*#__PURE__*/Object.freeze({
@@ -141,8 +150,8 @@ var browser = /*#__PURE__*/Object.freeze({
141
150
 
142
151
  // Copyright 2025 The Chromium Authors
143
152
  class NodeWorkerScope {
144
- postMessage(message) {
145
- WorkerThreads.parentPort?.postMessage(message);
153
+ postMessage(message, transfer) {
154
+ WorkerThreads.parentPort?.postMessage(message, transfer);
146
155
  }
147
156
  set onmessage(listener) {
148
157
  WorkerThreads.parentPort?.addEventListener('message', msg => {
@@ -207,6 +216,15 @@ const HOST_RUNTIME$1 = {
207
216
  return new NodeWorker(url);
208
217
  },
209
218
  workerScope: new NodeWorkerScope(),
219
+ getOnLine() {
220
+ return true;
221
+ },
222
+ getUserAgent() {
223
+ return 'Node.js';
224
+ },
225
+ getLocalStorage() {
226
+ return undefined;
227
+ },
210
228
  };
211
229
 
212
230
  var HostRuntime = /*#__PURE__*/Object.freeze({
@@ -778,9 +796,7 @@ var ExperimentName;
778
796
  ExperimentName["CAPTURE_NODE_CREATION_STACKS"] = "capture-node-creation-stacks";
779
797
  ExperimentName["LIVE_HEAP_PROFILE"] = "live-heap-profile";
780
798
  ExperimentName["PROTOCOL_MONITOR"] = "protocol-monitor";
781
- ExperimentName["SAMPLING_HEAP_PROFILER_TIMELINE"] = "sampling-heap-profiler-timeline";
782
799
  ExperimentName["TIMELINE_INVALIDATION_TRACKING"] = "timeline-invalidation-tracking";
783
- ExperimentName["APCA"] = "apca";
784
800
  ExperimentName["FONT_EDITOR"] = "font-editor";
785
801
  ExperimentName["INSTRUMENTATION_BREAKPOINTS"] = "instrumentation-breakpoints";
786
802
  ExperimentName["USE_SOURCE_MAP_SCOPES"] = "use-source-map-scopes";
@@ -6803,7 +6819,7 @@ class SecondaryInitManager {
6803
6819
  this.argsStep2 = argsStep2;
6804
6820
  const { promise: argsStep3, resolve: resolveArgsStep3 } = Promise.withResolvers();
6805
6821
  this.argsStep3 = argsStep3;
6806
- port.onmessage = e => {
6822
+ const listener = (e) => {
6807
6823
  const data = e.data;
6808
6824
  switch (data.step) {
6809
6825
  case 1:
@@ -6814,9 +6830,12 @@ class SecondaryInitManager {
6814
6830
  break;
6815
6831
  case 3:
6816
6832
  resolveArgsStep3(data.args);
6833
+ port.removeEventListener('message', listener);
6817
6834
  break;
6818
6835
  }
6819
6836
  };
6837
+ port.addEventListener('message', listener);
6838
+ port.start();
6820
6839
  void this.initialize(port);
6821
6840
  }
6822
6841
  async getNodeSelfSizes() {
@@ -6837,22 +6856,20 @@ class SecondaryInitManager {
6837
6856
  };
6838
6857
  const dominatorsAndRetainedSizes = await HeapSnapshot.calculateDominatorsAndRetainedSizes(args);
6839
6858
  const dominatedNodesOutputs = HeapSnapshot.buildDominatedNodes({ ...args, ...dominatorsAndRetainedSizes });
6840
- const results = {
6859
+ const resultsFromSecondWorker = {
6841
6860
  ...retainers,
6842
6861
  ...dominatorsAndRetainedSizes,
6843
6862
  ...dominatedNodesOutputs,
6844
6863
  };
6845
- port.postMessage({ resultsFromSecondWorker: results }, {
6846
- transfer: [
6847
- results.dominatorsTree.buffer,
6848
- results.firstRetainerIndex.buffer,
6849
- results.retainedSizes.buffer,
6850
- results.retainingEdges.buffer,
6851
- results.retainingNodes.buffer,
6852
- results.dominatedNodes.buffer,
6853
- results.firstDominatedNodeIndex.buffer,
6854
- ]
6855
- });
6864
+ port.postMessage({ resultsFromSecondWorker }, [
6865
+ resultsFromSecondWorker.dominatorsTree.buffer,
6866
+ resultsFromSecondWorker.retainedSizes.buffer,
6867
+ resultsFromSecondWorker.firstRetainerIndex.buffer,
6868
+ resultsFromSecondWorker.retainingNodes.buffer,
6869
+ resultsFromSecondWorker.retainingEdges.buffer,
6870
+ resultsFromSecondWorker.firstDominatedNodeIndex.buffer,
6871
+ resultsFromSecondWorker.dominatedNodes.buffer,
6872
+ ]);
6856
6873
  }
6857
6874
  catch (e) {
6858
6875
  port.postMessage({ error: e + '\n' + e?.stack });
@@ -7048,20 +7065,23 @@ class HeapSnapshot {
7048
7065
  }
7049
7066
  startInitStep1InSecondThread(secondWorker) {
7050
7067
  const resultsFromSecondWorker = new Promise((resolve, reject) => {
7051
- secondWorker.onmessage = (event) => {
7052
- const data = event.data;
7068
+ const listener = (e) => {
7069
+ const data = e.data;
7053
7070
  if (data?.problemReport) {
7054
7071
  const problemReport = data.problemReport;
7055
7072
  console.warn(formatProblemReport(this, problemReport));
7056
7073
  }
7057
7074
  else if (data?.resultsFromSecondWorker) {
7058
- const resultsFromSecondWorker = data.resultsFromSecondWorker;
7059
- resolve(resultsFromSecondWorker);
7075
+ secondWorker.removeEventListener('message', listener);
7076
+ resolve(data.resultsFromSecondWorker);
7060
7077
  }
7061
7078
  else if (data?.error) {
7079
+ secondWorker.removeEventListener('message', listener);
7062
7080
  reject(data.error);
7063
7081
  }
7064
7082
  };
7083
+ secondWorker.addEventListener('message', listener);
7084
+ secondWorker.start();
7065
7085
  });
7066
7086
  const edgeCount = this.#edgeCount;
7067
7087
  const { containmentEdges, edgeToNodeOffset, edgeFieldsCount, nodeFieldCount } = this;
@@ -9332,6 +9352,11 @@ var HeapSnapshot$1 = /*#__PURE__*/Object.freeze({
9332
9352
  createJSHeapSnapshotForTesting: createJSHeapSnapshotForTesting
9333
9353
  });
9334
9354
 
9355
+ // Copyright 2023 The Chromium Authors
9356
+ new FinalizationRegistry(url => {
9357
+ URL.revokeObjectURL(url);
9358
+ });
9359
+
9335
9360
  // Copyright 2013 The Chromium Authors
9336
9361
  class BalancedJSONTokenizer {
9337
9362
  callback;
@@ -9608,16 +9633,15 @@ var HeapSnapshotLoader$1 = /*#__PURE__*/Object.freeze({
9608
9633
 
9609
9634
  // Copyright 2011 The Chromium Authors
9610
9635
  class HeapSnapshotWorkerDispatcher {
9611
- #objects;
9636
+ #objects = [];
9612
9637
  #postMessage;
9613
9638
  constructor(postMessage) {
9614
- this.#objects = [];
9615
9639
  this.#postMessage = postMessage;
9616
9640
  }
9617
9641
  sendEvent(name, data) {
9618
9642
  this.#postMessage({ eventName: name, data });
9619
9643
  }
9620
- async dispatchMessage({ data, ports }) {
9644
+ async dispatchMessage({ data, ports, }) {
9621
9645
  const response = {
9622
9646
  callId: data.callId,
9623
9647
  result: null,