brave-mcp 0.1.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 (280) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +802 -0
  3. package/build/src/DevToolsConnectionAdapter.js +69 -0
  4. package/build/src/DevtoolsUtils.js +294 -0
  5. package/build/src/McpContext.js +676 -0
  6. package/build/src/McpPage.js +108 -0
  7. package/build/src/McpResponse.js +718 -0
  8. package/build/src/Mutex.js +37 -0
  9. package/build/src/PageCollector.js +310 -0
  10. package/build/src/SlimMcpResponse.js +18 -0
  11. package/build/src/WaitForHelper.js +153 -0
  12. package/build/src/bin/brave-devtools-cli-options.js +651 -0
  13. package/build/src/bin/brave-devtools-mcp-cli-options.js +312 -0
  14. package/build/src/bin/brave-devtools-mcp-main.js +35 -0
  15. package/build/src/bin/brave-devtools-mcp.js +22 -0
  16. package/build/src/bin/brave-devtools.js +190 -0
  17. package/build/src/bin/check-latest-version.js +25 -0
  18. package/build/src/bin/cliDefinitions.js +615 -0
  19. package/build/src/browser.js +295 -0
  20. package/build/src/daemon/client.js +152 -0
  21. package/build/src/daemon/daemon.js +202 -0
  22. package/build/src/daemon/types.js +6 -0
  23. package/build/src/daemon/utils.js +109 -0
  24. package/build/src/formatters/ConsoleFormatter.js +241 -0
  25. package/build/src/formatters/IssueFormatter.js +192 -0
  26. package/build/src/formatters/NetworkFormatter.js +218 -0
  27. package/build/src/formatters/SnapshotFormatter.js +134 -0
  28. package/build/src/index.js +216 -0
  29. package/build/src/issue-descriptions.js +39 -0
  30. package/build/src/logger.js +36 -0
  31. package/build/src/polyfill.js +7 -0
  32. package/build/src/telemetry/ClearcutLogger.js +234 -0
  33. package/build/src/telemetry/WatchdogClient.js +60 -0
  34. package/build/src/telemetry/flagUtils.js +45 -0
  35. package/build/src/telemetry/metricUtils.js +14 -0
  36. package/build/src/telemetry/persistence.js +53 -0
  37. package/build/src/telemetry/toolMetricsUtils.js +88 -0
  38. package/build/src/telemetry/types.js +38 -0
  39. package/build/src/telemetry/watchdog/ClearcutSender.js +203 -0
  40. package/build/src/telemetry/watchdog/main.js +127 -0
  41. package/build/src/third_party/devtools-formatter-worker.js +7 -0
  42. package/build/src/third_party/index.js +28 -0
  43. package/build/src/third_party/issue-descriptions/CoepCoopSandboxedIframeCannotNavigateToCoopPage.md +4 -0
  44. package/build/src/third_party/issue-descriptions/CoepCorpNotSameOrigin.md +8 -0
  45. package/build/src/third_party/issue-descriptions/CoepCorpNotSameOriginAfterDefaultedToSameOriginByCoep.md +18 -0
  46. package/build/src/third_party/issue-descriptions/CoepCorpNotSameSite.md +7 -0
  47. package/build/src/third_party/issue-descriptions/CoepFrameResourceNeedsCoepHeader.md +10 -0
  48. package/build/src/third_party/issue-descriptions/CompatibilityModeQuirks.md +5 -0
  49. package/build/src/third_party/issue-descriptions/CookieAttributeValueExceedsMaxSize.md +5 -0
  50. package/build/src/third_party/issue-descriptions/LowTextContrast.md +5 -0
  51. package/build/src/third_party/issue-descriptions/SameSiteExcludeContextDowngradeRead.md +8 -0
  52. package/build/src/third_party/issue-descriptions/SameSiteExcludeContextDowngradeSet.md +8 -0
  53. package/build/src/third_party/issue-descriptions/SameSiteExcludeNavigationContextDowngrade.md +8 -0
  54. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureErrorRead.md +8 -0
  55. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureErrorSet.md +8 -0
  56. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureWarnRead.md +8 -0
  57. package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureWarnSet.md +8 -0
  58. package/build/src/third_party/issue-descriptions/SameSiteUnspecifiedLaxAllowUnsafeRead.md +9 -0
  59. package/build/src/third_party/issue-descriptions/SameSiteUnspecifiedLaxAllowUnsafeSet.md +9 -0
  60. package/build/src/third_party/issue-descriptions/SameSiteWarnCrossDowngradeRead.md +8 -0
  61. package/build/src/third_party/issue-descriptions/SameSiteWarnCrossDowngradeSet.md +8 -0
  62. package/build/src/third_party/issue-descriptions/SameSiteWarnStrictLaxDowngradeStrict.md +8 -0
  63. package/build/src/third_party/issue-descriptions/arInsecureContext.md +7 -0
  64. package/build/src/third_party/issue-descriptions/arInvalidInfoHeader.md +5 -0
  65. package/build/src/third_party/issue-descriptions/arInvalidRegisterOsSourceHeader.md +5 -0
  66. package/build/src/third_party/issue-descriptions/arInvalidRegisterOsTriggerHeader.md +5 -0
  67. package/build/src/third_party/issue-descriptions/arInvalidRegisterSourceHeader.md +5 -0
  68. package/build/src/third_party/issue-descriptions/arInvalidRegisterTriggerHeader.md +5 -0
  69. package/build/src/third_party/issue-descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +5 -0
  70. package/build/src/third_party/issue-descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +6 -0
  71. package/build/src/third_party/issue-descriptions/arNoRegisterOsSourceHeader.md +5 -0
  72. package/build/src/third_party/issue-descriptions/arNoRegisterOsTriggerHeader.md +5 -0
  73. package/build/src/third_party/issue-descriptions/arNoRegisterSourceHeader.md +5 -0
  74. package/build/src/third_party/issue-descriptions/arNoRegisterTriggerHeader.md +5 -0
  75. package/build/src/third_party/issue-descriptions/arNoWebOrOsSupport.md +4 -0
  76. package/build/src/third_party/issue-descriptions/arOsSourceIgnored.md +18 -0
  77. package/build/src/third_party/issue-descriptions/arOsTriggerIgnored.md +19 -0
  78. package/build/src/third_party/issue-descriptions/arPermissionPolicyDisabled.md +8 -0
  79. package/build/src/third_party/issue-descriptions/arSourceAndTriggerHeaders.md +9 -0
  80. package/build/src/third_party/issue-descriptions/arSourceIgnored.md +13 -0
  81. package/build/src/third_party/issue-descriptions/arTriggerIgnored.md +12 -0
  82. package/build/src/third_party/issue-descriptions/arUntrustworthyReportingOrigin.md +10 -0
  83. package/build/src/third_party/issue-descriptions/arWebAndOsHeaders.md +11 -0
  84. package/build/src/third_party/issue-descriptions/bounceTrackingMitigations.md +3 -0
  85. package/build/src/third_party/issue-descriptions/clientHintMetaTagAllowListInvalidOrigin.md +4 -0
  86. package/build/src/third_party/issue-descriptions/clientHintMetaTagModifiedHTML.md +4 -0
  87. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidAllowlistItemType.md +12 -0
  88. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidHeader.md +12 -0
  89. package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidUrlPattern.md +8 -0
  90. package/build/src/third_party/issue-descriptions/connectionAllowlistItemNotInnerList.md +12 -0
  91. package/build/src/third_party/issue-descriptions/connectionAllowlistMoreThanOneList.md +7 -0
  92. package/build/src/third_party/issue-descriptions/connectionAllowlistReportingEndpointNotToken.md +10 -0
  93. package/build/src/third_party/issue-descriptions/cookieCrossSiteRedirectDowngrade.md +12 -0
  94. package/build/src/third_party/issue-descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +4 -0
  95. package/build/src/third_party/issue-descriptions/cookieExcludeDomainNonAscii.md +11 -0
  96. package/build/src/third_party/issue-descriptions/cookieExcludePortMismatch.md +8 -0
  97. package/build/src/third_party/issue-descriptions/cookieExcludeSchemeMismatch.md +7 -0
  98. package/build/src/third_party/issue-descriptions/cookieExcludeThirdPartyPhaseoutRead.md +6 -0
  99. package/build/src/third_party/issue-descriptions/cookieExcludeThirdPartyPhaseoutSet.md +6 -0
  100. package/build/src/third_party/issue-descriptions/cookieWarnDomainNonAscii.md +11 -0
  101. package/build/src/third_party/issue-descriptions/cookieWarnMetadataGrantRead.md +4 -0
  102. package/build/src/third_party/issue-descriptions/cookieWarnMetadataGrantSet.md +4 -0
  103. package/build/src/third_party/issue-descriptions/cookieWarnThirdPartyPhaseoutRead.md +6 -0
  104. package/build/src/third_party/issue-descriptions/cookieWarnThirdPartyPhaseoutSet.md +6 -0
  105. package/build/src/third_party/issue-descriptions/corsAllowCredentialsRequired.md +6 -0
  106. package/build/src/third_party/issue-descriptions/corsDisabledScheme.md +7 -0
  107. package/build/src/third_party/issue-descriptions/corsDisallowedByMode.md +7 -0
  108. package/build/src/third_party/issue-descriptions/corsHeaderDisallowedByPreflightResponse.md +5 -0
  109. package/build/src/third_party/issue-descriptions/corsInvalidHeaderValues.md +7 -0
  110. package/build/src/third_party/issue-descriptions/corsLocalNetworkAccessPermissionDenied.md +19 -0
  111. package/build/src/third_party/issue-descriptions/corsMethodDisallowedByPreflightResponse.md +5 -0
  112. package/build/src/third_party/issue-descriptions/corsNoCorsRedirectModeNotFollow.md +5 -0
  113. package/build/src/third_party/issue-descriptions/corsOriginMismatch.md +6 -0
  114. package/build/src/third_party/issue-descriptions/corsPreflightResponseInvalid.md +5 -0
  115. package/build/src/third_party/issue-descriptions/corsRedirectContainsCredentials.md +5 -0
  116. package/build/src/third_party/issue-descriptions/corsWildcardOriginNotAllowed.md +8 -0
  117. package/build/src/third_party/issue-descriptions/cspEvalViolation.md +9 -0
  118. package/build/src/third_party/issue-descriptions/cspInlineViolation.md +10 -0
  119. package/build/src/third_party/issue-descriptions/cspTrustedTypesPolicyViolation.md +5 -0
  120. package/build/src/third_party/issue-descriptions/cspTrustedTypesSinkViolation.md +8 -0
  121. package/build/src/third_party/issue-descriptions/cspURLViolation.md +10 -0
  122. package/build/src/third_party/issue-descriptions/deprecation.md +3 -0
  123. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsHttpNotFound.md +1 -0
  124. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsInvalidResponse.md +1 -0
  125. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsNoResponse.md +1 -0
  126. package/build/src/third_party/issue-descriptions/federatedAuthRequestApprovalDeclined.md +1 -0
  127. package/build/src/third_party/issue-descriptions/federatedAuthRequestCanceled.md +1 -0
  128. package/build/src/third_party/issue-descriptions/federatedAuthRequestErrorFetchingSignin.md +1 -0
  129. package/build/src/third_party/issue-descriptions/federatedAuthRequestErrorIdToken.md +1 -0
  130. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenHttpNotFound.md +1 -0
  131. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenInvalidRequest.md +1 -0
  132. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenInvalidResponse.md +1 -0
  133. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenNoResponse.md +1 -0
  134. package/build/src/third_party/issue-descriptions/federatedAuthRequestInvalidSigninResponse.md +1 -0
  135. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestHttpNotFound.md +1 -0
  136. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestInvalidResponse.md +1 -0
  137. package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestNoResponse.md +1 -0
  138. package/build/src/third_party/issue-descriptions/federatedAuthRequestTooManyRequests.md +1 -0
  139. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestInvalidAccountsResponse.md +1 -0
  140. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestInvalidConfigOrWellKnown.md +1 -0
  141. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoAccountSharingPermission.md +1 -0
  142. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoApiPermission.md +1 -0
  143. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoReturningUserFromFetchedAccounts.md +1 -0
  144. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotIframe.md +1 -0
  145. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotPotentiallyTrustworthy.md +1 -0
  146. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotSameOrigin.md +1 -0
  147. package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotSignedInWithIdp.md +1 -0
  148. package/build/src/third_party/issue-descriptions/fetchingPartitionedBlobURL.md +7 -0
  149. package/build/src/third_party/issue-descriptions/genericFormAriaLabelledByToNonExistingIdError.md +8 -0
  150. package/build/src/third_party/issue-descriptions/genericFormAutocompleteAttributeEmptyError.md +5 -0
  151. package/build/src/third_party/issue-descriptions/genericFormDuplicateIdForInputError.md +5 -0
  152. package/build/src/third_party/issue-descriptions/genericFormEmptyIdAndNameAttributesForInputError.md +5 -0
  153. package/build/src/third_party/issue-descriptions/genericFormInputAssignedAutocompleteValueToIdOrNameAttributeError.md +5 -0
  154. package/build/src/third_party/issue-descriptions/genericFormInputHasWrongButWellIntendedAutocompleteValueError.md +5 -0
  155. package/build/src/third_party/issue-descriptions/genericFormInputWithNoLabelError.md +5 -0
  156. package/build/src/third_party/issue-descriptions/genericFormLabelForMatchesNonExistingIdError.md +5 -0
  157. package/build/src/third_party/issue-descriptions/genericFormLabelForNameError.md +5 -0
  158. package/build/src/third_party/issue-descriptions/genericFormLabelHasNeitherForNorNestedInputError.md +5 -0
  159. package/build/src/third_party/issue-descriptions/genericNavigationEntryMarkedSkippable.md +7 -0
  160. package/build/src/third_party/issue-descriptions/genericResponseWasBlockedByORB.md +4 -0
  161. package/build/src/third_party/issue-descriptions/heavyAd.md +10 -0
  162. package/build/src/third_party/issue-descriptions/mixedContent.md +5 -0
  163. package/build/src/third_party/issue-descriptions/navigatingPartitionedBlobURL.md +5 -0
  164. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabled.md +7 -0
  165. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
  166. package/build/src/third_party/issue-descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
  167. package/build/src/third_party/issue-descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
  168. package/build/src/third_party/issue-descriptions/permissionElementFencedFrameDisallowed.md +5 -0
  169. package/build/src/third_party/issue-descriptions/permissionElementFontSizeTooLarge.md +5 -0
  170. package/build/src/third_party/issue-descriptions/permissionElementFontSizeTooSmall.md +5 -0
  171. package/build/src/third_party/issue-descriptions/permissionElementGeolocationDeprecated.md +5 -0
  172. package/build/src/third_party/issue-descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
  173. package/build/src/third_party/issue-descriptions/permissionElementInvalidDisplayStyle.md +5 -0
  174. package/build/src/third_party/issue-descriptions/permissionElementInvalidSizeValue.md +5 -0
  175. package/build/src/third_party/issue-descriptions/permissionElementInvalidType.md +5 -0
  176. package/build/src/third_party/issue-descriptions/permissionElementInvalidTypeActivation.md +5 -0
  177. package/build/src/third_party/issue-descriptions/permissionElementLowContrast.md +5 -0
  178. package/build/src/third_party/issue-descriptions/permissionElementNonOpaqueColor.md +5 -0
  179. package/build/src/third_party/issue-descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
  180. package/build/src/third_party/issue-descriptions/permissionElementPaddingRightUnsupported.md +6 -0
  181. package/build/src/third_party/issue-descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
  182. package/build/src/third_party/issue-descriptions/permissionElementRegistrationFailed.md +5 -0
  183. package/build/src/third_party/issue-descriptions/permissionElementRequestInProgress.md +5 -0
  184. package/build/src/third_party/issue-descriptions/permissionElementSecurityChecksFailed.md +5 -0
  185. package/build/src/third_party/issue-descriptions/permissionElementTypeNotSupported.md +5 -0
  186. package/build/src/third_party/issue-descriptions/permissionElementUntrustedEvent.md +7 -0
  187. package/build/src/third_party/issue-descriptions/placeholderDescriptionForInvisibleIssues.md +3 -0
  188. package/build/src/third_party/issue-descriptions/propertyRuleInvalidNameIssue.md +3 -0
  189. package/build/src/third_party/issue-descriptions/propertyRuleIssue.md +7 -0
  190. package/build/src/third_party/issue-descriptions/selectElementAccessibilityDisallowedOptGroupChild.md +7 -0
  191. package/build/src/third_party/issue-descriptions/selectElementAccessibilityDisallowedSelectChild.md +7 -0
  192. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentAttributesSelectDescendant.md +3 -0
  193. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentLegendChild.md +3 -0
  194. package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentOptionChild.md +3 -0
  195. package/build/src/third_party/issue-descriptions/selectElementAccessibilityNonPhrasingContentOptionChild.md +3 -0
  196. package/build/src/third_party/issue-descriptions/selectivePermissionsIntervention.md +7 -0
  197. package/build/src/third_party/issue-descriptions/sharedArrayBuffer.md +7 -0
  198. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +1 -0
  199. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorDictionaryLoadFailure.md +3 -0
  200. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorMatchingDictionaryNotUsed.md +3 -0
  201. package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md +1 -0
  202. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorCossOriginNoCorsRequest.md +1 -0
  203. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorDisallowedBySettings.md +1 -0
  204. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorExpiredResponse.md +3 -0
  205. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorFeatureDisabled.md +3 -0
  206. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInsufficientResources.md +1 -0
  207. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidMatchField.md +1 -0
  208. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidStructuredHeader.md +1 -0
  209. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidTTLField.md +1 -0
  210. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNavigationRequest.md +3 -0
  211. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNoMatchField.md +1 -0
  212. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonIntegerTTLField.md +1 -0
  213. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonListMatchDestField.md +1 -0
  214. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonSecureContext.md +3 -0
  215. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringIdField.md +1 -0
  216. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringInMatchDestList.md +1 -0
  217. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringMatchField.md +1 -0
  218. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonTokenTypeField.md +1 -0
  219. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorRequestAborted.md +1 -0
  220. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorShuttingDown.md +1 -0
  221. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorTooLongIdField.md +3 -0
  222. package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorUnsupportedType.md +3 -0
  223. package/build/src/third_party/issue-descriptions/sriInvalidSignatureHeader.md +14 -0
  224. package/build/src/third_party/issue-descriptions/sriInvalidSignatureInputHeader.md +15 -0
  225. package/build/src/third_party/issue-descriptions/sriMissingSignatureHeader.md +8 -0
  226. package/build/src/third_party/issue-descriptions/sriMissingSignatureInputHeader.md +7 -0
  227. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsIncorrectLength.md +11 -0
  228. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsNotByteSequence.md +14 -0
  229. package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsParameterized.md +15 -0
  230. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidComponentName.md +8 -0
  231. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidComponentType.md +13 -0
  232. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidDerivedComponentParameter.md +4 -0
  233. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidHeaderComponentParameter.md +5 -0
  234. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidParameter.md +11 -0
  235. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderKeyIdLength.md +12 -0
  236. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderMissingLabel.md +6 -0
  237. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderMissingRequiredParameters.md +8 -0
  238. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderValueMissingComponents.md +11 -0
  239. package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderValueNotInnerList.md +11 -0
  240. package/build/src/third_party/issue-descriptions/sriValidationFailedIntegrityMismatch.md +10 -0
  241. package/build/src/third_party/issue-descriptions/sriValidationFailedInvalidLength.md +5 -0
  242. package/build/src/third_party/issue-descriptions/sriValidationFailedSignatureExpired.md +6 -0
  243. package/build/src/third_party/issue-descriptions/sriValidationFailedSignatureMismatch.md +11 -0
  244. package/build/src/third_party/issue-descriptions/stylesheetLateImport.md +4 -0
  245. package/build/src/third_party/issue-descriptions/stylesheetRequestFailed.md +3 -0
  246. package/build/src/third_party/issue-descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +3 -0
  247. package/build/src/third_party/issue-descriptions/unencodedDigestIncorrectDigestLength.md +12 -0
  248. package/build/src/third_party/issue-descriptions/unencodedDigestIncorrectDigestType.md +17 -0
  249. package/build/src/third_party/issue-descriptions/unencodedDigestMalformedDictionary.md +14 -0
  250. package/build/src/third_party/issue-descriptions/unencodedDigestUnknownAlgorithm.md +15 -0
  251. package/build/src/third_party/lighthouse-devtools-mcp-bundle.js +59418 -0
  252. package/build/src/tools/ToolDefinition.js +72 -0
  253. package/build/src/tools/categories.js +26 -0
  254. package/build/src/tools/console.js +85 -0
  255. package/build/src/tools/emulation.js +55 -0
  256. package/build/src/tools/extensions.js +96 -0
  257. package/build/src/tools/inPage.js +105 -0
  258. package/build/src/tools/input.js +376 -0
  259. package/build/src/tools/lighthouse.js +123 -0
  260. package/build/src/tools/memory.js +28 -0
  261. package/build/src/tools/network.js +120 -0
  262. package/build/src/tools/pages.js +336 -0
  263. package/build/src/tools/performance.js +190 -0
  264. package/build/src/tools/screencast.js +79 -0
  265. package/build/src/tools/screenshot.js +84 -0
  266. package/build/src/tools/script.js +125 -0
  267. package/build/src/tools/slim/tools.js +81 -0
  268. package/build/src/tools/snapshot.js +56 -0
  269. package/build/src/tools/tools.js +53 -0
  270. package/build/src/trace-processing/parse.js +84 -0
  271. package/build/src/types.js +6 -0
  272. package/build/src/utils/ExtensionRegistry.js +35 -0
  273. package/build/src/utils/check-for-updates.js +72 -0
  274. package/build/src/utils/files.js +19 -0
  275. package/build/src/utils/keyboard.js +296 -0
  276. package/build/src/utils/pagination.js +49 -0
  277. package/build/src/utils/string.js +36 -0
  278. package/build/src/utils/types.js +6 -0
  279. package/build/src/version.js +6 -0
  280. package/package.json +87 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { zod } from '../third_party/index.js';
7
+ export function defineTool(definition) {
8
+ if (typeof definition === 'function') {
9
+ const factory = definition;
10
+ return (args) => {
11
+ return factory(args);
12
+ };
13
+ }
14
+ return definition;
15
+ }
16
+ export function definePageTool(definition) {
17
+ if (typeof definition === 'function') {
18
+ return (args) => {
19
+ const tool = definition(args);
20
+ return {
21
+ ...tool,
22
+ pageScoped: true,
23
+ };
24
+ };
25
+ }
26
+ return {
27
+ ...definition,
28
+ pageScoped: true,
29
+ };
30
+ }
31
+ export const CLOSE_PAGE_ERROR = 'The last open page cannot be closed. It is fine to keep it open.';
32
+ export const pageIdSchema = {
33
+ pageId: zod.number().optional().describe('Targets a specific page by ID.'),
34
+ };
35
+ export const timeoutSchema = {
36
+ timeout: zod
37
+ .number()
38
+ .int()
39
+ .optional()
40
+ .describe(`Maximum wait time in milliseconds. If set to 0, the default timeout will be used.`)
41
+ .transform(value => {
42
+ return value && value <= 0 ? undefined : value;
43
+ }),
44
+ };
45
+ export function viewportTransform(arg) {
46
+ if (!arg) {
47
+ return undefined;
48
+ }
49
+ const [dimensions, ...tags] = arg.split(',');
50
+ const isMobile = tags.includes('mobile');
51
+ const hasTouch = tags.includes('touch');
52
+ const isLandscape = tags.includes('landscape');
53
+ const [width, height, dpr] = dimensions.split('x').map(Number);
54
+ return {
55
+ width,
56
+ height,
57
+ deviceScaleFactor: dpr,
58
+ isMobile: isMobile,
59
+ isLandscape: isLandscape,
60
+ hasTouch: hasTouch,
61
+ };
62
+ }
63
+ export function geolocationTransform(arg) {
64
+ if (!arg) {
65
+ return undefined;
66
+ }
67
+ const [latitude, longitude] = arg.split('x').map(Number);
68
+ return {
69
+ latitude,
70
+ longitude,
71
+ };
72
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export var ToolCategory;
7
+ (function (ToolCategory) {
8
+ ToolCategory["INPUT"] = "input";
9
+ ToolCategory["NAVIGATION"] = "navigation";
10
+ ToolCategory["EMULATION"] = "emulation";
11
+ ToolCategory["PERFORMANCE"] = "performance";
12
+ ToolCategory["NETWORK"] = "network";
13
+ ToolCategory["DEBUGGING"] = "debugging";
14
+ ToolCategory["EXTENSIONS"] = "extensions";
15
+ ToolCategory["IN_PAGE"] = "in-page";
16
+ })(ToolCategory || (ToolCategory = {}));
17
+ export const labels = {
18
+ [ToolCategory.INPUT]: 'Input automation',
19
+ [ToolCategory.NAVIGATION]: 'Navigation automation',
20
+ [ToolCategory.EMULATION]: 'Emulation',
21
+ [ToolCategory.PERFORMANCE]: 'Performance',
22
+ [ToolCategory.NETWORK]: 'Network',
23
+ [ToolCategory.DEBUGGING]: 'Debugging',
24
+ [ToolCategory.EXTENSIONS]: 'Extensions',
25
+ [ToolCategory.IN_PAGE]: 'In-page tools',
26
+ };
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { zod } from '../third_party/index.js';
7
+ import { ToolCategory } from './categories.js';
8
+ import { definePageTool } from './ToolDefinition.js';
9
+ const FILTERABLE_MESSAGE_TYPES = [
10
+ 'log',
11
+ 'debug',
12
+ 'info',
13
+ 'error',
14
+ 'warn',
15
+ 'dir',
16
+ 'dirxml',
17
+ 'table',
18
+ 'trace',
19
+ 'clear',
20
+ 'startGroup',
21
+ 'startGroupCollapsed',
22
+ 'endGroup',
23
+ 'assert',
24
+ 'profile',
25
+ 'profileEnd',
26
+ 'count',
27
+ 'timeEnd',
28
+ 'verbose',
29
+ 'issue',
30
+ ];
31
+ export const listConsoleMessages = definePageTool({
32
+ name: 'list_console_messages',
33
+ description: 'List all console messages for the currently selected page since the last navigation.',
34
+ annotations: {
35
+ category: ToolCategory.DEBUGGING,
36
+ readOnlyHint: true,
37
+ },
38
+ schema: {
39
+ pageSize: zod
40
+ .number()
41
+ .int()
42
+ .positive()
43
+ .optional()
44
+ .describe('Maximum number of messages to return. When omitted, returns all messages.'),
45
+ pageIdx: zod
46
+ .number()
47
+ .int()
48
+ .min(0)
49
+ .optional()
50
+ .describe('Page number to return (0-based). When omitted, returns the first page.'),
51
+ types: zod
52
+ .array(zod.enum(FILTERABLE_MESSAGE_TYPES))
53
+ .optional()
54
+ .describe('Filter messages to only return messages of the specified resource types. When omitted or empty, returns all messages.'),
55
+ includePreservedMessages: zod
56
+ .boolean()
57
+ .default(false)
58
+ .optional()
59
+ .describe('Set to true to return the preserved messages over the last 3 navigations.'),
60
+ },
61
+ handler: async (request, response) => {
62
+ response.setIncludeConsoleData(true, {
63
+ pageSize: request.params.pageSize,
64
+ pageIdx: request.params.pageIdx,
65
+ types: request.params.types,
66
+ includePreservedMessages: request.params.includePreservedMessages,
67
+ });
68
+ },
69
+ });
70
+ export const getConsoleMessage = definePageTool({
71
+ name: 'get_console_message',
72
+ description: `Gets a console message by its ID. You can get all messages by calling ${listConsoleMessages.name}.`,
73
+ annotations: {
74
+ category: ToolCategory.DEBUGGING,
75
+ readOnlyHint: true,
76
+ },
77
+ schema: {
78
+ msgid: zod
79
+ .number()
80
+ .describe('The msgid of a console message on the page from the listed console messages'),
81
+ },
82
+ handler: async (request, response) => {
83
+ response.attachConsoleMessage(request.params.msgid);
84
+ },
85
+ });
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ *
6
+ */
7
+ import { zod, PredefinedNetworkConditions } from '../third_party/index.js';
8
+ import { ToolCategory } from './categories.js';
9
+ import { definePageTool, geolocationTransform, viewportTransform, } from './ToolDefinition.js';
10
+ const throttlingOptions = [
11
+ 'Offline',
12
+ ...Object.keys(PredefinedNetworkConditions),
13
+ ];
14
+ export const emulate = definePageTool({
15
+ name: 'emulate',
16
+ description: `Emulates various features on the selected page.`,
17
+ annotations: {
18
+ category: ToolCategory.EMULATION,
19
+ readOnlyHint: false,
20
+ },
21
+ schema: {
22
+ networkConditions: zod
23
+ .enum(throttlingOptions)
24
+ .optional()
25
+ .describe(`Throttle network. Omit to disable throttling.`),
26
+ cpuThrottlingRate: zod
27
+ .number()
28
+ .min(1)
29
+ .max(20)
30
+ .optional()
31
+ .describe('Represents the CPU slowdown factor. Omit or set the rate to 1 to disable throttling'),
32
+ geolocation: zod
33
+ .string()
34
+ .optional()
35
+ .transform(geolocationTransform)
36
+ .describe('Geolocation (`<latitude>x<longitude>`) to emulate. Latitude between -90 and 90. Longitude between -180 and 180. Omit to clear the geolocation override.'),
37
+ userAgent: zod
38
+ .string()
39
+ .optional()
40
+ .describe('User agent to emulate. Set to empty string to clear the user agent override.'),
41
+ colorScheme: zod
42
+ .enum(['dark', 'light', 'auto'])
43
+ .optional()
44
+ .describe('Emulate the dark or the light mode. Set to "auto" to reset to the default.'),
45
+ viewport: zod
46
+ .string()
47
+ .optional()
48
+ .transform(viewportTransform)
49
+ .describe(`Emulate device viewports '<width>x<height>x<devicePixelRatio>[,mobile][,touch][,landscape]'. 'touch' and 'mobile' to emulate mobile devices. 'landscape' to emulate landscape mode.`),
50
+ },
51
+ handler: async (request, _response, context) => {
52
+ const page = request.page;
53
+ await context.emulate(request.params, page.pptrPage);
54
+ },
55
+ });
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { zod } from '../third_party/index.js';
7
+ import { ToolCategory } from './categories.js';
8
+ import { defineTool } from './ToolDefinition.js';
9
+ const EXTENSIONS_CONDITION = 'experimentalExtensionSupport';
10
+ export const installExtension = defineTool({
11
+ name: 'install_extension',
12
+ description: 'Installs a Chrome extension from the given path.',
13
+ annotations: {
14
+ category: ToolCategory.EXTENSIONS,
15
+ readOnlyHint: false,
16
+ conditions: [EXTENSIONS_CONDITION],
17
+ },
18
+ schema: {
19
+ path: zod
20
+ .string()
21
+ .describe('Absolute path to the unpacked extension folder.'),
22
+ },
23
+ handler: async (request, response, context) => {
24
+ const { path } = request.params;
25
+ const id = await context.installExtension(path);
26
+ response.appendResponseLine(`Extension installed. Id: ${id}`);
27
+ },
28
+ });
29
+ export const uninstallExtension = defineTool({
30
+ name: 'uninstall_extension',
31
+ description: 'Uninstalls a Chrome extension by its ID.',
32
+ annotations: {
33
+ category: ToolCategory.EXTENSIONS,
34
+ readOnlyHint: false,
35
+ conditions: [EXTENSIONS_CONDITION],
36
+ },
37
+ schema: {
38
+ id: zod.string().describe('ID of the extension to uninstall.'),
39
+ },
40
+ handler: async (request, response, context) => {
41
+ const { id } = request.params;
42
+ await context.uninstallExtension(id);
43
+ response.appendResponseLine(`Extension uninstalled. Id: ${id}`);
44
+ },
45
+ });
46
+ export const listExtensions = defineTool({
47
+ name: 'list_extensions',
48
+ description: 'Lists all extensions via this server, including their name, ID, version, and enabled status.',
49
+ annotations: {
50
+ category: ToolCategory.EXTENSIONS,
51
+ readOnlyHint: true,
52
+ conditions: [EXTENSIONS_CONDITION],
53
+ },
54
+ schema: {},
55
+ handler: async (_request, response, _context) => {
56
+ response.setListExtensions();
57
+ },
58
+ });
59
+ export const reloadExtension = defineTool({
60
+ name: 'reload_extension',
61
+ description: 'Reloads an unpacked Chrome extension by its ID.',
62
+ annotations: {
63
+ category: ToolCategory.EXTENSIONS,
64
+ readOnlyHint: false,
65
+ conditions: [EXTENSIONS_CONDITION],
66
+ },
67
+ schema: {
68
+ id: zod.string().describe('ID of the extension to reload.'),
69
+ },
70
+ handler: async (request, response, context) => {
71
+ const { id } = request.params;
72
+ const extension = context.getExtension(id);
73
+ if (!extension) {
74
+ throw new Error(`Extension with ID ${id} not found.`);
75
+ }
76
+ await context.installExtension(extension.path);
77
+ response.appendResponseLine('Extension reloaded.');
78
+ },
79
+ });
80
+ export const triggerExtensionAction = defineTool({
81
+ name: 'trigger_extension_action',
82
+ description: 'Triggers an action in a Chrome extension.',
83
+ annotations: {
84
+ category: ToolCategory.EXTENSIONS,
85
+ readOnlyHint: false,
86
+ conditions: [EXTENSIONS_CONDITION],
87
+ },
88
+ schema: {
89
+ id: zod.string().describe('ID of the extension.'),
90
+ },
91
+ handler: async (request, response, context) => {
92
+ const { id } = request.params;
93
+ await context.triggerExtensionAction(id);
94
+ response.appendResponseLine(`Extension action triggered. Id: ${id}`);
95
+ },
96
+ });
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { zod, ajv, } from '../third_party/index.js';
7
+ import { ToolCategory } from './categories.js';
8
+ import { definePageTool } from './ToolDefinition.js';
9
+ export const listInPageTools = definePageTool({
10
+ name: 'list_in_page_tools',
11
+ description: `Lists all in-page tools the page exposes for providing runtime information.
12
+ In-page tools can be called via the 'execute_in_page_tool()' MCP tool.
13
+ Alternatively, in-page tools can be executed by calling 'evaluate_script' and adding the
14
+ following command to the script:
15
+ 'window.__dtmcp.executeTool(toolName, params)'
16
+ This might be helpful when the in-page-tools return non-serializable values or when composing
17
+ the in-page-tools with additional functionality.`,
18
+ annotations: {
19
+ category: ToolCategory.IN_PAGE,
20
+ readOnlyHint: true,
21
+ conditions: ['inPageTools'],
22
+ },
23
+ schema: {},
24
+ handler: async (_request, response, _context) => {
25
+ response.setListInPageTools();
26
+ },
27
+ });
28
+ export const executeInPageTool = definePageTool({
29
+ name: 'execute_in_page_tool',
30
+ description: `Executes a tool exposed by the page.`,
31
+ annotations: {
32
+ category: ToolCategory.IN_PAGE,
33
+ readOnlyHint: false,
34
+ conditions: ['inPageTools'],
35
+ },
36
+ schema: {
37
+ toolName: zod.string().describe('The name of the tool to execute'),
38
+ params: zod
39
+ .string()
40
+ .optional()
41
+ .describe('The JSON-stringified parameters to pass to the tool'),
42
+ },
43
+ handler: async (request, response) => {
44
+ const toolName = request.params.toolName;
45
+ let params = {};
46
+ if (request.params.params) {
47
+ try {
48
+ const parsed = JSON.parse(request.params.params);
49
+ if (typeof parsed === 'object' && parsed !== null) {
50
+ params = parsed;
51
+ }
52
+ else {
53
+ throw new Error('Parsed params is not an object');
54
+ }
55
+ }
56
+ catch (e) {
57
+ const errorMessage = e instanceof Error ? e.message : String(e);
58
+ throw new Error(`Failed to parse params as JSON: ${errorMessage}`);
59
+ }
60
+ }
61
+ // Creates array of ElementHandles from the UIDs in the params.
62
+ // We do not replace the uids with the ElementsHandles yet, because
63
+ // the `evaluate` function only turns them into DOM elements if they
64
+ // are passed as non-nested arguments.
65
+ const handles = [];
66
+ for (const value of Object.values(params)) {
67
+ if (value instanceof Object &&
68
+ 'uid' in value &&
69
+ typeof value.uid === 'string' &&
70
+ Object.keys(value).length === 1) {
71
+ handles.push(await request.page.getElementByUid(value.uid));
72
+ }
73
+ }
74
+ const toolGroup = request.page.getInPageTools();
75
+ const tool = toolGroup?.tools.find(t => t.name === toolName);
76
+ if (!tool) {
77
+ throw new Error(`Tool ${toolName} not found`);
78
+ }
79
+ const ajvInstance = new ajv();
80
+ const validate = ajvInstance.compile(tool.inputSchema);
81
+ const valid = validate(params);
82
+ if (!valid) {
83
+ throw new Error(`Invalid parameters for tool ${toolName}: ${ajvInstance.errorsText(validate.errors)}`);
84
+ }
85
+ const result = await request.page.pptrPage.evaluate(async (name, args, ...elements) => {
86
+ // Replace the UIDs with DOM elements.
87
+ for (const [key, value] of Object.entries(args)) {
88
+ if (value instanceof Object &&
89
+ 'uid' in value &&
90
+ typeof value.uid === 'string' &&
91
+ Object.keys(value).length === 1) {
92
+ args[key] = elements.shift();
93
+ }
94
+ }
95
+ if (!window.__dtmcp?.executeTool) {
96
+ throw new Error('No tools found on the page');
97
+ }
98
+ const toolResult = await window.__dtmcp.executeTool(name, args);
99
+ return {
100
+ result: toolResult,
101
+ };
102
+ }, toolName, params, ...handles);
103
+ response.appendResponseLine(JSON.stringify(result, null, 2));
104
+ },
105
+ });