io.github.serkan-ozal/browser-devtools-mcp
NPM · BROWSER-DEVTOOLS-MCP · 2 COMPONENTS · SCANNED SEP 21
Playwright browser & Node.js MCP. ARIA refs, screenshots, ref-based interactions.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security75
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects sharp 0.34.5, a direct dependency. A fixed version is available. View diagnostics → Fail
- Runs a script at install time (postinstall) that we could not recognise. It may be perfectly ordinary, but we do not read the published tarball, so we cannot say what it does. View diagnostics → Partial
- 67 of 246 dependencies flagged as unhealthy (1 deprecated). View diagnostics → Partial
Provenance & Transparency6
- Repository check failed: the declared repository URL returned HTTP 404. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: the license (Elastic-2.0) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 131 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability80
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 8731 tokens (~171/item across 51 items; 51 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
- Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage93
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 75% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "debug_remove-probe" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 52 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the io.github.serkan-ozal/browser-devtools-mcp server?
io.github.serkan-ozal/browser-devtools-mcp runs locally as an npm package, launched with npx -y browser-devtools-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · browser-devtools-mcp
claude mcp add serkan-ozal-browser-devtools-mcp -- npx -y browser-devtools-mcp
{
"mcpServers": {
"serkan-ozal-browser-devtools-mcp": {
"command": "npx",
"args": [
"-y",
"browser-devtools-mcp"
]
}
}
} {
"servers": {
"serkan-ozal-browser-devtools-mcp": {
"command": "npx",
"args": [
"-y",
"browser-devtools-mcp"
]
}
}
} codex mcp add serkan-ozal-browser-devtools-mcp -- npx -y browser-devtools-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"serkan-ozal-browser-devtools-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"browser-devtools-mcp"
],
"enabled": true
}
}
} openclaw mcp add serkan-ozal-browser-devtools-mcp --command npx --arg -y --arg browser-devtools-mcp
mcp_servers:
serkan-ozal-browser-devtools-mcp:
command: "npx"
args: ["-y", "browser-devtools-mcp"] {
"McpServers": {
"serkan-ozal-browser-devtools-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"browser-devtools-mcp"
]
}
}
} assistant mcp add serkan-ozal-browser-devtools-mcp -t stdio -c npx -a -y browser-devtools-mcp
{
"mcpServers": {
"serkan-ozal-browser-devtools-mcp": {
"command": "npx",
"args": [
"-y",
"browser-devtools-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Sept 26 −3
- Stability: pass → 0.80 functional
- 18 Sept 26 0
- Stability: 0.97 → pass security
- 17 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Sept 26 −3
- Stability: pass → 0.80 functional
- 11 Sept 26 0
- Stability: 0.97 → pass security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed npm/browser-devtools-mcp@0.9.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| postinstall | unreviewed | node postinstall.cjs |
Background: Why install scripts are a supply-chain risk →
Vulnerabilities 2 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-f88m-g3jw-g9cj | high | yes | ||
| GHSA-rgj7-g3m4-5g8c | high | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 246 packages
| Packages resolved | 246 |
|---|---|
| Deprecated | 1 |
| Stale | 66 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
a11y_take-aria-snapshot ~218
ARIA snapshot of the page or a scoped element. Returns a tree with refs (e1, e2, ...) and a refs map. Use refs in interaction tools: selector "e1" or "@e1" to click/fill that element. Output includes URL, title, and YAML tree. Refs are valid until next snapshot or navigation. interactiveOnly: only interactive elements get refs; omit for content roles (headings, etc.) too. cursorInteractive: true adds refs for clickable elements without ARIA (e.g. div with cursor:pointer/onclick). Use with a11y_take-ax-tree-snapshot for full UI analysis.
| Name | Type | Req | Description |
|---|---|---|---|
| compact | boolean | – | Omit structural nodes without content. |
| cursorInteractive | boolean | – | Include cursor:pointer / onclick elements. |
| interactiveOnly | boolean | – | Only interactive elements get refs. |
| maxDepth | integer | – | Max tree depth; 0 = root only. |
| selector | string | – | Scope to this element; omit for full page. |
| Name | Type | Req | Description |
|---|---|---|---|
| output | string | yes | Includes the page URL, title, and a YAML-formatted accessibility tree with [ref=e1] etc. |
| refs | object | yes | Map of ref id to { role, name?, selector, nth? }. Use selector "e1" or "@e1" in interaction tools. |
No examples provided.
a11y_take-ax-tree-snapshot ~327
Combines Chromium AX tree with runtime visual diagnostics (bounding box, visibility, viewport). Use to detect: elements with role/name but hidden or off-screen; layout/geometry issues; overlap/occlusion (enable checkOcclusion). When investigating UI/layout or when clicks fail on seemingly visible elements, set checkOcclusion:true—it uses elementFromPoint() at center+corners to find what is actually on top. boundingBox is from getBoundingClientRect() (viewport coords; layout box only). selectorHint is best-effort (data-testid/data-selector/id). Use with a11y_take-aria-snapshot for full UI analysis.
| Name | Type | Req | Description |
|---|---|---|---|
| checkOcclusion | boolean | – | Use elementFromPoint to detect what is on top. |
| includeRuntimeVisual | boolean | – | Include bounding box and visibility. |
| includeStyles | boolean | – | – |
| onlyInViewport | boolean | – | – |
| onlyVisible | boolean | – | – |
| roles | array | – | ARIA/AX role names to include; omit for default set. Standard roles: ARIA https://w3c.github.io/aria/#role_definitions, Chromium AX https://chromium.googlesource.com/chromium/src/+/main/ui/accessibil… |
| styleProperties | array | – | CSS property names when includeStyles. |
| textPreviewMaxLength | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| axNodeCount | integer | yes | Total number of nodes returned by Chromium Accessibility.getFullAXTree before filtering. |
| candidateCount | integer | yes | Number of DOM-backed AX nodes that passed role filtering before enrichment. |
| enrichedCount | integer | yes | Number of nodes included in the final enriched snapshot output. |
| nodes | array | yes | List of enriched DOM-backed AX nodes combining accessibility metadata with visual diagnostics. |
| title | string | yes | The document title of the page at the time of the snapshot. |
| truncatedBySafetyCap | boolean | yes | Indicates whether the result set was truncated by an internal safety cap to prevent excessive output size. |
| url | string | yes | The current page URL at the time the AX snapshot was captured. |
No examples provided.
content_get-as-html ~118
Gets the HTML content of the current page. By default, all <script> tags are removed from the output unless "removeScripts" is explicitly set to "false".
| Name | Type | Req | Description |
|---|---|---|---|
| cleanHtml | boolean | – | – |
| maxLength | integer | – | – |
| minify | boolean | – | – |
| removeComments | boolean | – | – |
| removeMeta | boolean | – | – |
| removeScripts | boolean | – | – |
| removeStyles | boolean | – | – |
| selector | string | – | Selector or ref; omit for full document. |
| Name | Type | Req | Description |
|---|---|---|---|
| output | string | yes | The requested HTML content of the page. |
No examples provided.
content_get-as-text ~51
Gets the visible text content of the current page.
| Name | Type | Req | Description |
|---|---|---|---|
| maxLength | integer | – | Truncate after this many characters. |
| selector | string | – | Limit text to this container; omit for full page. |
| Name | Type | Req | Description |
|---|---|---|---|
| output | string | yes | The requested text content of the page. |
No examples provided.
content_save-as-pdf ~68
Saves the current page as a PDF file.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Page size. |
| margin | object | – | Margin (e.g. 1cm). |
| name | string | – | – |
| outputPath | string | – | – |
| printBackground | boolean | – | Background. |
| Name | Type | Req | Description |
|---|---|---|---|
| filePath | string | yes | Full path of the saved PDF file. |
No examples provided.
content_start-recording ~101
Starts video recording of the browser page. Recording captures all page interactions until content_stop-recording is called. Uses Playwright's native screencast API — works in all modes (headless, headed, persistent, CDP attach). Only supported on Chromium-based browsers.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Name for the video file (without extension). Defaults to "recording". |
| outputDir | string | – | Directory where the video file will be saved. |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | Status message. |
| startTimestamp | number | – | Wall-clock time (ms since epoch) of the video's first frame. Use this to align video time with other timestamps (logs, network events). A given event's position in the video is `(eventTimestampMs - s… |
No examples provided.
content_stop-recording ~42
Stops video recording of the browser page and saves the video file. Must be called after content_start-recording. The video is saved as a WebM file.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| filePath | string | – | Full path of the saved video file. |
No examples provided.
content_take-screenshot ~187
Takes a screenshot of the current page or a specific element. Do NOT use for page structure—use ARIA/AX snapshots instead. Use only for visual verification (design check, visual bug, contrast, layout). Screenshot is saved to disk; use includeBase64 only when the file cannot be read from the returned path (e.g. remote, container).
| Name | Type | Req | Description |
|---|---|---|---|
| annotate | boolean | – | Overlay ARIA ref labels. |
| annotateContent | boolean | – | Annotate headings. |
| annotateCursorInteractive | boolean | – | Annotate cursor:pointer elements. |
| fullPage | boolean | – | – |
| includeBase64 | boolean | – | Base64 fallback. |
| name | string | – | – |
| outputPath | string | – | – |
| quality | integer | – | JPEG quality 0–100. |
| selector | string | – | Selector/ref; omit=viewport. |
| type | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| annotations | array | – | When annotate is true, list of refs and bounding boxes. When selector is set: only annotations overlapping the element, box relative to that element. When fullPage is true: box is document-relative (… |
| filePath | string | yes | Full path of the saved screenshot file. |
| image | object | – | Image data included only when "includeBase64" input parameter is set to true. |
No examples provided.
debug_add-watch ~91
Adds a watch expression to be evaluated at every breakpoint hit. Watch expression results are included in the snapshot's watchResults field. Examples: - "user.name" - "this.state" - "items.length" - "JSON.stringify(config)" Watch expressions are evaluated in the context of the paused frame.
| Name | Type | Req | Description |
|---|---|---|---|
| expression | string | yes | Expression evaluated at every tracepoint hit (e.g. user.name). |
| Name | Type | Req | Description |
|---|---|---|---|
| expression | string | yes | The watch expression |
| id | string | yes | Watch expression ID |
| message | string | yes | Status message |
No examples provided.
debug_clear-probe-snapshots ~104
Clears snapshots captured by tracepoints, logpoints, and/or exceptionpoints. Optional `types`: array of `tracepoint`, `logpoint`, `exceptionpoint`. If omitted or empty, clears all. Optional `probeId`: clear only snapshots for this probe (for tracepoint/logpoint).
| Name | Type | Req | Description |
|---|---|---|---|
| probeId | string | – | Clear only this probe (tracepoint/logpoint). |
| types | array | – | Clear only these types; omit for all. |
| Name | Type | Req | Description |
|---|---|---|---|
| exceptionpointCleared | number | yes | Exceptionpoint snapshots cleared |
| logpointCleared | number | yes | Logpoint snapshots cleared |
| message | string | yes | Status message |
| tracepointCleared | number | yes | Tracepoint snapshots cleared |
No examples provided.
debug_clear-probes ~77
Removes tracepoints, logpoints, and/or watch expressions. Optional `types`: array of `tracepoint`, `logpoint`, `watches`. If omitted or empty, clears all.
| Name | Type | Req | Description |
|---|---|---|---|
| types | array | – | Which probe types to clear: tracepoint, logpoint, watches. If omitted or empty, all are cleared. |
| Name | Type | Req | Description |
|---|---|---|---|
| logpointsCleared | number | yes | Number of logpoints cleared |
| message | string | yes | Status message |
| tracepointsCleared | number | yes | Number of tracepoints cleared |
| watchesCleared | number | yes | Number of watch expressions cleared |
No examples provided.
debug_get-probe-snapshots ~267
Retrieves snapshots captured by tracepoints, logpoints, and/or exceptionpoints. Optional `types`: array of `tracepoint`, `logpoint`, `exceptionpoint`. If omitted or empty, returns all. Response fields: `tracepointSnapshots`, `logpointSnapshots`, `exceptionpointSnapshots`. Optional `probeId` filters tracepoint or logpoint snapshots; `fromSequence` and `limit` apply per type. Output trimming: by default only the top 5 call stack frames are returned, only `local` scope(s) are included, and variables per scope are capped at 20. Override with maxCallStackDepth, includeScopes, maxVariablesPerScope.
| Name | Type | Req | Description |
|---|---|---|---|
| fromSequence | integer | – | Snapshots with sequence > this (polling). |
| includeScopes | array | – | Scope types to include. Default [local] (local only to keep payload small). |
| limit | integer | – | – |
| maxCallStackDepth | integer | – | Max call stack frames per snapshot. Default 5. |
| maxVariablesPerScope | integer | – | Max variables per scope. Default 20. |
| probeId | string | – | Filter by this probe ID (tracepoint/logpoint). |
| types | array | – | Return only these types; omit for all. |
| Name | Type | Req | Description |
|---|---|---|---|
| exceptionpointSnapshots | array | yes | Exceptionpoint snapshots |
| logpointSnapshots | array | yes | Logpoint snapshots |
| tracepointSnapshots | array | yes | Tracepoint snapshots |
No examples provided.
debug_list-probes ~62
Lists tracepoints, logpoints, and/or watch expressions. Optional `types`: array of `tracepoint`, `logpoint`, `watch`. If omitted or empty, returns all.
| Name | Type | Req | Description |
|---|---|---|---|
| types | array | – | List only these types; omit for all. |
| Name | Type | Req | Description |
|---|---|---|---|
| logpoints | array | yes | Logpoints |
| tracepoints | array | yes | Tracepoints |
| watches | array | yes | Watch expressions |
No examples provided.
debug_put-exceptionpoint ~75
Sets the exception tracepoint state: - "none": Don't capture on exceptions - "uncaught": Capture only on uncaught exceptions - "all": Capture on all exceptions (caught and uncaught) When an exception occurs, a snapshot is captured with exception details.
| Name | Type | Req | Description |
|---|---|---|---|
| state | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| currentState | string | yes | Current state |
| message | string | yes | Status message |
| previousState | string | yes | Previous state |
No examples provided.
debug_put-logpoint ~279
Puts a logpoint at the specified location. When the logpoint is hit, the logExpression is evaluated and the result is captured in the snapshot's logResult field. Logpoints are lightweight - they only capture the log expression result, NOT call stack or watch expressions. Use tracepoints for full debug context. urlPattern matches script URLs (e.g., "app.js"). Auto-escaped, do not add backslashes. logExpression: a single JavaScript expression (e.g. "user.name", "JSON.stringify({ a, b })", or "{ discountAmount, finalAmount, n }"). Object literals are supported; for maximum compatibility prefer a single variable or JSON.stringify(...). Returns resolvedLocations: 0 means pattern didn't match any loaded scripts.
| Name | Type | Req | Description |
|---|---|---|---|
| columnNumber | integer | – | 1-based column. |
| condition | string | – | Only log when this expression is true. |
| hitCondition | string | – | Hit-count condition (e.g. > 5). |
| lineNumber | integer | yes | 1-based line in script. |
| logExpression | string | yes | JS expression to evaluate and log (e.g. user.name, JSON.stringify({ a, b }), or { x, y }). |
| urlPattern | string | yes | Glob pattern for script URL (e.g. **/app.js). |
| Name | Type | Req | Description |
|---|---|---|---|
| columnNumber | number | – | Column number |
| condition | string | – | Condition expression |
| hitCondition | string | – | Hit count condition |
| id | string | yes | Debug point ID |
| lineNumber | number | yes | Line number |
| logExpression | string | yes | Log expression |
| resolvedLocations | number | yes | Number of locations where logpoint was resolved |
| urlPattern | string | yes | URL pattern |
No examples provided.
debug_put-tracepoint ~219
Puts a non-blocking tracepoint at the specified location. When hit, a snapshot of the call stack and local variables is captured automatically without pausing execution. The urlPattern matches script URLs. Special characters are auto-escaped. Examples: - "app.js" matches scripts containing "app.js" - "bundle.min.js" matches scripts containing "bundle.min.js" DO NOT escape characters yourself (e.g., don't use "app\.js"). Returns resolvedLocations: number of scripts where the tracepoint was set. If 0, the pattern didn't match any loaded scripts.
| Name | Type | Req | Description |
|---|---|---|---|
| columnNumber | integer | – | 1-based column. |
| condition | string | – | Only trigger when this expression is true. |
| hitCondition | string | – | Hit count (e.g. == 5, >= 10, % 10 == 0). |
| lineNumber | integer | yes | 1-based line. |
| urlPattern | string | yes | Glob pattern for script URL (e.g. **/app.js). |
| Name | Type | Req | Description |
|---|---|---|---|
| columnNumber | number | – | Column number |
| condition | string | – | Condition expression |
| hitCondition | string | – | Hit count condition |
| id | string | yes | Tracepoint ID |
| lineNumber | number | yes | Line number |
| resolvedLocations | number | yes | Number of locations where tracepoint was resolved |
| urlPattern | string | yes | URL pattern |
No examples provided.
debug_remove-probe ~75
Removes a tracepoint, logpoint, or watch expression by ID. `type`: `tracepoint`, `logpoint`, or `watch`. `id`: the probe or watch ID (from list-probes).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Probe or watch ID from list-probes. |
| type | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | Status message |
| removed | boolean | yes | Whether the probe or watch was removed |
No examples provided.
debug_resolve-source-location ~136
Resolves a generated/bundled code location to its original source via source maps. Useful for translating minified stack traces or bundle line numbers to original TypeScript/JavaScript source. Requires a page with debugging context (debugging is auto-enabled on first use). Input: generated script URL, line, column (1-based). Output: original source path, line, column when a source map is available.
| Name | Type | Req | Description |
|---|---|---|---|
| column | integer | – | 1-based column; default 1. |
| line | integer | yes | 1-based line in generated code. |
| url | string | yes | Generated script URL (bundle). |
| Name | Type | Req | Description |
|---|---|---|---|
| column | number | – | Column number in original source (1-based) |
| line | number | – | Line number in original source (1-based) |
| name | string | – | Original identifier name if available |
| resolved | boolean | yes | Whether the location was resolved to original source |
| source | string | – | Original source file path |
No examples provided.
debug_status ~49
Returns the current debugging status including: - Whether debugging is enabled - Source map status - Exceptionpoint state - Count of tracepoints, logpoints, and watches - Snapshot statistics
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | yes | Whether debugging is enabled |
| exceptionBreakpoint | string | yes | Exceptionpoint state (none, uncaught, all) |
| hasSourceMaps | boolean | yes | Whether source maps are loaded |
| logpointCount | number | yes | Number of logpoints |
| snapshotStats | – | yes | Snapshot statistics |
| tracepointCount | number | yes | Number of tracepoints |
| watchExpressionCount | number | yes | Number of watch expressions |
No examples provided.
execute ~677
Batch-execute multiple tool calls in a single request via custom JavaScript. Reduces round-trips and token usage. **IMPORTANT** - The code is already run inside an async function. Pass only the body (statements). Do NOT wrap in `async function() { ... }` or `async () => { ... }` — that causes a syntax error. Write `await callTool(...); return x;` directly. **IMPORTANT:** - `page` (Playwright Page) is available in the VM — use it for navigation or `page.evaluate()`. - Prefer interaction tools with refs (e1, e2 from a11y_take-aria-snapshot); use raw Playwright only as last resort. - `document`/`window` are not in the VM — use `page.evaluate(() => { ... })` to run code in the browser. - Use `waitForNavigation: true` on interaction_click when the click navigates. - After navigation, do not continue with refs from the previous page — take fresh refs with a11y_take-aria-snapshot first. Bindings: - await callTool(name, input, returnOutput?): async — always use with await. Returns the tool output for in-code use. returnOutput=true also includes it in the response toolOutputs array; false (default) omits it. Throws on failure — execution stops at the first error; partial toolOutputs/logs are still returned. On failure, failedTool in the response identifies which tool caused the error. Max 50 callTool invocations per execution. - console.log/warn/error: captured in the response logs array. - sleep(ms): async delay. Built-ins: Math, JSON, Date, RegExp, Number, String, Boolean, Array, Object, Promise, Map, Set, WeakMap, WeakSet, Symbol, Proxy, Reflect, URL, URLSearchParams, TextEncoder/Decoder, structuredClone, crypto.randomUUID(), AbortController, setTimeout/clearTimeout. NOT available: require, import, process, fs, Buffer, fetch. **Example** — fill form, submit (with navigation wait), then snapshot and screenshot: await callTool('interaction_fill', { selector: 'e3', value: 'user@test.com' }); await callTool('interaction_fil…
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | JavaScript code: the body only (no async function wrapper). Use await callTool(name, input, returnOutput?) and return for result. Do NOT wrap in async function() { ... }. |
| timeoutMs | integer | – | Wall-clock timeout for the entire execution in ms, including awaited tool calls and sleep (default: 30000, max: 120000). |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | Error message on failure. Partial toolOutputs/logs are still returned. |
| failedTool | object | – | Present when a callTool invocation caused the error. |
| logs | array | yes | Captured console.log/warn/error calls. |
| result | – | – | Return value of the code (JSON-safe). Undefined on error or when nothing is returned. |
| toolOutputs | array | yes | Tool outputs where callTool was called with returnOutput=true. |
No examples provided.
interaction_click ~162
Clicks an element. Accepts selector or ref (e.g. e1, @e1). Set waitForNavigation: true when the click opens a new page — waits for navigation then for network idle so snapshot/screenshot see full content.
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | yes | CSS selector or ref from a11y snapshot (e.g. e1, @e1). |
| timeoutMs | integer | – | Wait for element, ms. Default 10000. |
| waitForNavigation | boolean | – | Wait for navigation triggered by click (parallel with click). Use when click opens a new page. |
| waitForTimeoutMs | integer | – | Timeout for navigation and for network idle wait (ms). Only when waitForNavigation is true. Default 30000. |
Structured output declared, but exposes no named fields.
No examples provided.
interaction_drag ~92
Drags an element to a target location. Accepts CSS selectors or refs (e.g. e1, @e1) from the last ARIA snapshot.
| Name | Type | Req | Description |
|---|---|---|---|
| sourceSelector | string | yes | CSS selector or ref for the element to drag. |
| targetSelector | string | yes | CSS selector or ref for the drop target. |
| timeoutMs | integer | – | Wait for elements, ms. Default 10000. |
Structured output declared, but exposes no named fields.
No examples provided.
interaction_fill ~84
Fills out an input field. Accepts a CSS selector or a ref from the last ARIA snapshot (e.g. e1, @e1).
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | yes | CSS selector or ref from a11y snapshot for the input. |
| timeoutMs | integer | – | Wait for element, ms. Default 10000. |
| value | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
interaction_hover ~75
Hovers an element on the page. Accepts a CSS selector or a ref from the last ARIA snapshot (e.g. e1, @e1).
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | yes | CSS selector or ref from a11y snapshot. |
| timeoutMs | integer | – | Wait for element, ms. Default 10000. |
Structured output declared, but exposes no named fields.
No examples provided.
interaction_press-key ~214
Presses a keyboard key with optional "hold" and auto-repeat behavior. Key facts: - keyboard.press(key, { delay }) does NOT trigger OS-style auto-repeat. - Some UI behaviors (especially scrolling) require repeated keydown events. - Use repeat=true + holdMs to approximate real keyboard holding. Execution logic: - If selector is provided, the element is focused first. - If holdMs is omitted or repeat=false: → a single keyboard.press() is executed. - If holdMs is provided AND repeat=true: → keyboard.press() is called repeatedly until holdMs elapses.
| Name | Type | Req | Description |
|---|---|---|---|
| holdMs | integer | – | Ms between keydown and keyup. |
| key | string | yes | Key name (e.g. Enter, ArrowDown, Space). |
| repeat | boolean | – | Repeat key while holdMs (e.g. for scroll). |
| repeatIntervalMs | integer | – | – |
| selector | string | – | Focus this element first; omit for page focus. |
| timeoutMs | integer | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
interaction_resize-viewport ~130
Resizes the PAGE VIEWPORT using Playwright viewport emulation (page.setViewportSize). This affects: - window.innerWidth / window.innerHeight - CSS media queries (responsive layouts) - Layout, rendering and screenshots Notes: - This does NOT resize the OS-level browser window. - Runtime switching to viewport=null (binding to real window size) is not supported by Playwright. If you need real window-driven responsive behavior, start the BrowserContext with viewport: null and use the window resize tool instead.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | yes | – |
| width | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| requested | object | yes | Requested viewport configuration. |
| viewport | object | yes | Viewport metrics observed inside the page after resizing. |
No examples provided.
interaction_resize-window ~172
Resizes the REAL BROWSER WINDOW (OS-level window) for the current page using Chrome DevTools Protocol (CDP). This tool works best on Chromium-based browsers (Chromium/Chrome/Edge). It is especially useful in headful sessions when you run with viewport emulation disabled (viewport: null), so the page layout follows the OS window size. Important: - If Playwright viewport emulation is enabled (viewport is NOT null), resizing the OS window may not change page layout. - On non-Chromium browsers (Firefox/WebKit), CDP is not available and this tool will fail.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | – | Required when state=normal. |
| state | string | – | When not normal, width/height may be ignored. |
| width | integer | – | Required when state=normal. |
| Name | Type | Req | Description |
|---|---|---|---|
| after | object | yes | Window bounds after resizing. |
| before | object | yes | Window bounds before resizing. |
| requested | object | yes | Requested window change parameters. |
| viewport | object | yes | Page viewport metrics after resizing (helps verify responsive behavior). |
No examples provided.
interaction_scroll ~246
Scrolls the page viewport or a specific scrollable element. Modes: - 'by': Scrolls by a relative delta (dx/dy) from the current scroll position. - 'to': Scrolls to an absolute scroll position (x/y). - 'top': Scrolls to the very top. - 'bottom': Scrolls to the very bottom. - 'left': Scrolls to the far left. - 'right': Scrolls to the far right. Use this tool to: - Reveal content below the fold - Jump to the top/bottom without knowing exact positions - Bring elements into view before clicking - Inspect lazy-loaded content that appears on scroll
| Name | Type | Req | Description |
|---|---|---|---|
| behavior | string | – | – |
| dx | number | – | – |
| dy | number | – | – |
| mode | string | – | by=dx,dy; to=x,y; or edge (top/bottom/left/right). |
| selector | string | – | Scrollable container: ref (e.g. from latest <a11y_take-aria-snapshot>), getBy… expression, or CSS. Omit for viewport. |
| x | number | – | – |
| y | number | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| after | object | yes | Scroll metrics after the scroll action. |
| before | object | yes | Scroll metrics before the scroll action. |
| behavior | string | yes | The scroll behavior used. |
| canScrollX | boolean | yes | Whether horizontal scrolling is possible (scrollWidth > clientWidth). |
| canScrollY | boolean | yes | Whether vertical scrolling is possible (scrollHeight > clientHeight). |
| isAtBottom | boolean | yes | Whether the scroll position is at the very bottom. |
| isAtLeft | boolean | yes | Whether the scroll position is at the far left. |
| isAtRight | boolean | yes | Whether the scroll position is at the far right. |
| isAtTop | boolean | yes | Whether the scroll position is at the very top. |
| maxScrollX | number | yes | Maximum horizontal scrollLeft (scrollWidth - clientWidth). |
| maxScrollY | number | yes | Maximum vertical scrollTop (scrollHeight - clientHeight). |
| mode | string | yes | The scroll mode used. |
| selector | string|null | yes | The selector of the scroll container if provided; otherwise null (document viewport). |
No examples provided.
interaction_select ~84
Select an option in a dropdown. Accepts a CSS selector or a ref from the last ARIA snapshot (e.g. e1, @e1).
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | yes | CSS selector or ref from a11y snapshot for the dropdown. |
| timeoutMs | integer | – | Wait for element, ms. Default 10000. |
| value | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
navigation_go-back-or-forward ~441
Navigates to the previous or next page in history. - `direction: "back"` — previous page in history. - `direction: "forward"` — next page in history. In case of multiple redirects, the navigation will resolve with the response of the last redirect. If cannot go back/forward, returns empty response. By default (includeSnapshot: true), an ARIA snapshot with refs is returned. Use `snapshotOptions` for `interactiveOnly` (default false) and `cursorInteractive` (default false), same as a11y_take-aria-snapshot. When `includeScreenshot: true`, the screenshot is always saved to disk; `screenshotFilePath` is returned. By default `outputPath` is the OS temp dir and `name` is "screenshot" (same as content_take-screenshot). Use `screenshotOptions.includeBase64: true` only when the file cannot be read from the returned path (e.g. remote, container).
| Name | Type | Req | Description |
|---|---|---|---|
| direction | string | yes | – |
| includeScreenshot | boolean | – | Take a screenshot after navigation; saved to disk (default: OS temp dir). Use includeBase64 only when file cannot be read from path. |
| includeSnapshot | boolean | – | Return ARIA snapshot with refs. |
| screenshotOptions | object | – | Options when includeScreenshot is true. Same semantics as <content_take-screenshot> (outputPath/name default to tmp and "screenshot"). |
| snapshotOptions | object | – | Options when includeSnapshot is true. Same as <a11y_take-aria-snapshot>. |
| timeout | integer | – | Max wait ms. 0=no timeout. |
| waitForNavigation | boolean | – | Wait for navigation then for network idle before snapshot/screenshot. Default true. |
| waitForTimeoutMs | integer | – | Timeout for navigation and network idle wait (ms). Only when waitForNavigation is true. Default 30000. |
| waitUntil | string | – | Playwright navigation lifecycle: when the main frame reaches this state. Does not use Playwright networkidle; use waitForNavigation for session network-idle after history navigation. |
| Name | Type | Req | Description |
|---|---|---|---|
| image | object | – | When includeScreenshot and screenshotOptions.includeBase64 are true: image sent as separate image content part. |
| ok | boolean | – | Contains a boolean stating whether the navigated page was successful (status in the range 200-299) or not. |
| output | string | – | – |
| refs | object | – | – |
| screenshotFilePath | string | – | When includeScreenshot is true: full path of the saved screenshot file. |
| status | integer | – | Contains the status code of the navigated page (e.g., 200 for a success). |
| statusText | string | – | Contains the status text of the navigated page (e.g. usually an "OK" for a success). |
| url | string | – | Contains the URL of the navigated page. |
No examples provided.
navigation_go-to ~475
Navigates to the given URL. **NOTE**: The tool either throws an error or returns a main resource response. The only exceptions are navigation to `about:blank` or navigation to the same URL with a different hash, which would succeed and return empty response. **By default** (`includeSnapshot: true`), an ARIA snapshot with refs is taken after navigation and returned in `output` and `refs`; you can use refs (e1, e2, ...) in interaction tools without calling a11y_take-aria-snapshot separately. Use `snapshotOptions` for `interactiveOnly` (default false) and `cursorInteractive` (default false). Set `includeSnapshot: false` to get only url/status/ok. When `includeScreenshot: true`, the screenshot is always saved to disk; `screenshotFilePath` is returned. By default `outputPath` is the OS temp dir and `name` is "screenshot" (same as content_take-screenshot). Use `screenshotOptions.includeBase64: true` only when the file cannot be read from the returned path (e.g. remote, container).
| Name | Type | Req | Description |
|---|---|---|---|
| includeScreenshot | boolean | – | Take a screenshot after navigation; saved to disk (default: OS temp dir). Use includeBase64 only when file cannot be read from path. |
| includeSnapshot | boolean | – | Return ARIA snapshot with refs after nav. |
| screenshotOptions | object | – | Options when includeScreenshot is true. Same semantics as <content_take-screenshot> (outputPath/name default to tmp and "screenshot"). |
| snapshotOptions | object | – | Options when includeSnapshot is true. Same as <a11y_take-aria-snapshot>. |
| timeout | integer | – | Max wait ms. 0=no timeout. |
| url | string | yes | – |
| waitForNavigation | boolean | – | Wait for navigation then for network idle before snapshot/screenshot. Default true. |
| waitForTimeoutMs | integer | – | Timeout for navigation and network idle wait (ms). Only when waitForNavigation is true. Default 30000. |
| waitUntil | string | – | Playwright navigation lifecycle: when the main frame reaches this state. Does not use Playwright networkidle; use waitForNavigation for session network-idle after navigation. |
| Name | Type | Req | Description |
|---|---|---|---|
| image | object | – | When includeScreenshot and screenshotOptions.includeBase64 are true: image sent as separate image content part. |
| ok | boolean | – | Contains a boolean stating whether the navigated page was successful (status in the range 200-299) or not. |
| output | string | – | When includeSnapshot is true: page URL, title, and ARIA tree with refs. |
| refs | object | – | When includeSnapshot is true: map of ref id (e1, e2, ...) to role/name/selector for use in interaction tools. |
| screenshotFilePath | string | – | When includeScreenshot is true: full path of the saved screenshot file. |
| status | integer | – | Contains the status code of the navigated page (e.g., 200 for a success). |
| statusText | string | – | Contains the status text of the navigated page (e.g. usually an "OK" for a success). |
| url | string | – | Contains the URL of the navigated page. |
No examples provided.
navigation_reload ~365
Reloads the current page. In case of multiple redirects, the navigation resolves with the response of the last redirect. If the reload does not produce a response, returns empty response. By default (includeSnapshot: true), an ARIA snapshot with refs is returned. Use `snapshotOptions` for `interactiveOnly` (default false) and `cursorInteractive` (default false), same as a11y_take-aria-snapshot. When `includeScreenshot: true`, the screenshot is saved to disk; `screenshotFilePath` is returned. Default path/name: OS temp dir and "screenshot" (same as content_take-screenshot). Use `screenshotOptions.includeBase64: true` only when the file cannot be read from the path.
| Name | Type | Req | Description |
|---|---|---|---|
| includeScreenshot | boolean | – | Take a screenshot after reload; saved to disk (default: OS temp dir). |
| includeSnapshot | boolean | – | Return ARIA snapshot with refs. |
| screenshotOptions | object | – | Options when includeScreenshot is true. Same semantics as <content_take-screenshot> (outputPath/name default to tmp and "screenshot"). |
| snapshotOptions | object | – | Options when includeSnapshot is true. Same as <a11y_take-aria-snapshot>. |
| timeout | integer | – | Max wait ms. |
| waitForNavigation | boolean | – | Wait for reload then for network idle before snapshot/screenshot. Default true. |
| waitForTimeoutMs | integer | – | Timeout for reload and network idle wait (ms). Only when waitForNavigation is true. Default 30000. |
| waitUntil | string | – | Playwright navigation lifecycle: when the main frame reaches this state. Does not use Playwright networkidle; use waitForNavigation for session network-idle after reload. |
| Name | Type | Req | Description |
|---|---|---|---|
| image | object | – | When includeScreenshot and screenshotOptions.includeBase64 are true: image sent as separate image content part. |
| ok | boolean | – | Contains a boolean stating whether the reloaded page was successful (status in the range 200-299) or not. |
| output | string | – | – |
| refs | object | – | – |
| screenshotFilePath | string | – | When includeScreenshot is true: full path of the saved screenshot file. |
| status | integer | – | Contains the status code of the reloaded page (e.g., 200 for a success). |
| statusText | string | – | Contains the status text of the reloaded page (e.g. usually an "OK" for a success). |
| url | string | – | Contains the URL of the reloaded page. |
No examples provided.
o11y_get-console-messages ~90
Retrieves console messages/logs from the browser with filtering options.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | object | – | – |
| search | string | – | Filter by message text. |
| sequenceNumber | integer | – | Incremental: only messages with sequence > this. |
| timestamp | integer | – | Only messages at or after this Unix ms. |
| type | string | – | Filter by level (this level or higher). |
| Name | Type | Req | Description |
|---|---|---|---|
| messages | array | yes | Retrieved console messages. |
No examples provided.
o11y_get-http-requests ~147
Retrieves HTTP requests from the browser with filtering options.
| Name | Type | Req | Description |
|---|---|---|---|
| includeRequestHeaders | boolean | – | Include request headers in each item. Default false. |
| includeResponseBody | boolean | – | Include response body in each item. Default false. |
| includeResponseHeaders | boolean | – | Include response headers in each item. Default false. |
| limit | object | – | – |
| ok | boolean | – | 2xx only. |
| resourceType | string | – | Type filter. |
| sequenceNumber | integer | – | Incremental: only requests with sequence > this. |
| status | object | – | HTTP status range. |
| timestamp | integer | – | Only requests at or after this Unix ms. |
| Name | Type | Req | Description |
|---|---|---|---|
| requests | array | yes | Retrieved HTTP requests. |
No examples provided.
o11y_get-trace-context ~37
Gets the OpenTelemetry trace context (trace id and tracestate) from the live browser page when OTEL is enabled.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| traceId | string | – | The OpenTelemetry compatible trace id of the current session if available. |
| traceState | string | – | The W3C tracestate value of the current session if available. |
No examples provided.
o11y_get-web-vitals ~109
Collects Web Vitals (LCP, INP, CLS, TTFB, FCP) with Google thresholds and recommendations. Call after navigation or user actions; use waitMs for more stable LCP/CLS/INP. Some metrics may be unavailable depending on browser and interactions.
| Name | Type | Req | Description |
|---|---|---|---|
| includeDebug | boolean | – | Include entry counts and LCP element hint. |
| waitMs | integer | – | Ms to wait before reading (e.g. let LCP settle). |
| Name | Type | Req | Description |
|---|---|---|---|
| debug | object | – | Optional debug details. |
| metrics | object | yes | Raw metric values (null if unavailable). |
| notes | array | yes | Notes about metric availability, browser limitations, and interpretation. |
| ratings | object | yes | Ratings computed from Google thresholds. |
| recommendations | object | yes | Recommendations based on the measured values and their ratings. |
| timestampMs | integer | yes | Unix epoch timestamp (ms) when the metrics were captured. |
| title | string | yes | Current page title. |
| url | string | yes | Current page URL. |
No examples provided.
o11y_new-trace-id ~28
Generates new OpenTelemetry compatible trace id and sets it to the current session.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| traceId | string | yes | The generated new OpenTelemetry compatible trace id. |
No examples provided.
o11y_set-trace-context ~82
Sets or clears the OpenTelemetry trace context. Empty traceId clears the MCP-pinned trace id (new browser traces get random ids). Empty traceState clears tracestate. Non-empty traceState must be valid W3C tracestate (comma-separated key=value list).
| Name | Type | Req | Description |
|---|---|---|---|
| traceId | string | – | – |
| traceState | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
react_get-component-for-element ~221
Finds React component(s) for a DOM element via React Fiber (best-effort). Give selector or (x,y); we resolve the element, find __reactFiber$ on it or ancestors, then build the component stack from the host fiber that owns that node. Fiber is not a public API—results vary by dev/prod build; names can be displayName, wrappers, or minified. wrappersDetected/wrapperFrames help with memo/forwardRef/context. If hostMapping.strategy is ancestor-fallback, use a more specific selector or deeper node for better accuracy.
| Name | Type | Req | Description |
|---|---|---|---|
| includePropsPreview | boolean | – | If true, includes a best-effort, truncated props preview for the nearest component. |
| maxPropsPreviewChars | integer | – | Maximum characters for props preview (after safe stringification). |
| maxStackDepth | integer | – | – |
| selector | string | – | Target element; takes precedence over x/y. |
| x | integer | – | Viewport X when selector omitted. |
| y | integer | – | Viewport Y when selector omitted. |
| Name | Type | Req | Description |
|---|---|---|---|
| react | object | yes | – |
| target | object | yes | – |
No examples provided.
react_get-element-for-component ~266
Maps a React component instance to the DOM elements it renders (DOM footprint) by traversing the Fiber graph. Prefer an anchor (anchorSelector or anchorX/anchorY) to target the instance; optionally add a query (componentName, fileNameHint, lineNumber) to search Fiber. With both, we rank candidates and pick the best match near the anchor. React DevTools hook gives reliable root discovery (getFiberRoots); without it we fall back to DOM scan for __reactFiber$ (best-effort). For more reliable roots in a persistent browser, install the React Developer Tools Chrome extension. Debug source is best-effort and may be missing in some builds.
| Name | Type | Req | Description |
|---|---|---|---|
| anchorSelector | string | – | Anchor selector/ref. |
| anchorX | integer | – | Viewport X when anchorSelector omitted. |
| anchorY | integer | – | Viewport Y when anchorSelector omitted. |
| componentName | string | – | – |
| fileNameHint | string | – | File hint. |
| lineNumber | integer | – | – |
| matchStrategy | string | – | – |
| maxElements | integer | – | – |
| maxMatches | integer | – | – |
| onlyInViewport | boolean | – | – |
| onlyVisible | boolean | – | – |
| textPreviewMaxLength | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| candidates | array | yes | Ranked candidate matches (best-first). |
| component | – | yes | – |
| elements | array | yes | – |
| fiberDetected | boolean | yes | True if DOM appears to contain React Fiber pointers (__reactFiber$...). |
| notes | array | yes | – |
| reactDetected | boolean | yes | True if __REACT_DEVTOOLS_GLOBAL_HOOK__ looks available. |
| rootDiscovery | string | yes | How roots were discovered. |
No examples provided.
scenario-add ~129
Adds a new scenario. A scenario is a reusable JS script (like execute) that can call tools via callTool(). Scenarios are stored on disk under the scenarios.json file (project-level by default, or global with scope="global").
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | yes | Description of what this scenario does. |
| name | string | yes | Unique scenario name (used as key). |
| scope | string | – | Storage scope (default: project). |
| script | string | yes | JavaScript code to execute. Same sandbox as <execute>: use await callTool(name, input, returnOutput?) to invoke tools. |
| Name | Type | Req | Description |
|---|---|---|---|
| scenario | object | yes | – |
No examples provided.
scenario-delete ~40
Deletes a scenario by name.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the scenario to delete. |
| scope | string | – | Storage scope (default: project). |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted | boolean | yes | Whether the scenario was found and deleted. |
No examples provided.
scenario-list ~55
Lists all available scenarios. When scope is omitted, returns scenarios from both project and global scopes (project overrides global for same name).
| Name | Type | Req | Description |
|---|---|---|---|
| scope | string | – | Filter by scope. Omit to list from both (project overrides global). |
| Name | Type | Req | Description |
|---|---|---|---|
| scenarios | array | yes | – |
No examples provided.
scenario-run ~108
Runs a saved scenario by name. Looks up the scenario in project scope first, then global. The scenario's JS script runs in the same sandbox as execute: callTool(), console, sleep are available. Scenarios can compose other scenarios via callTool('scenario-run', { name: '...' }). Max recursion depth: 5.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the scenario to run. |
| timeoutMs | integer | – | Wall-clock timeout in ms (default: 30000). |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | – |
| failedTool | object | – | – |
| logs | array | yes | – |
| result | – | – | – |
| scenarioName | string | yes | – |
| toolOutputs | array | yes | – |
No examples provided.
scenario-search ~71
Searches scenarios by query across both project and global scopes. Uses configurable search strategy (SEARCH_STRATEGY or SCENARIO_SEARCH_STRATEGY env var). Returns matching scenarios ranked by relevance.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum number of results (default: 10). |
| query | string | yes | Search query. |
| Name | Type | Req | Description |
|---|---|---|---|
| scenarios | array | yes | – |
No examples provided.
scenario-update ~72
Updates an existing scenario's description and/or script.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | New description (omit to keep current). |
| name | string | yes | Name of the scenario to update. |
| scope | string | – | Storage scope (default: project). |
| script | string | – | New script (omit to keep current). |
| Name | Type | Req | Description |
|---|---|---|---|
| scenario | object | yes | – |
No examples provided.
stub_clear ~58
Clears stubs installed. - If stubId is provided, clears only that stub. - If stubId is omitted, clears all stubs for the current session/context.
| Name | Type | Req | Description |
|---|---|---|---|
| stubId | string | – | Remove this stub; omit to clear all. |
| Name | Type | Req | Description |
|---|---|---|---|
| clearedCount | integer | yes | Number of stubs removed. |
No examples provided.
What is the io.github.serkan-ozal/browser-devtools-mcp server?
io.github.serkan-ozal/browser-devtools-mcp is listed in the public MCP registry as io.github.serkan-ozal/browser-devtools-mcp. Playwright browser & Node.js MCP. ARIA refs, screenshots, ref-based interactions. This page covers its npm package (browser-devtools-mcp).
Is the io.github.serkan-ozal/browser-devtools-mcp server safe to use?
io.github.serkan-ozal/browser-devtools-mcp scores 66 out of 100 on VerifyMCP. We recorded 2 known advisories against it as of 21 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.serkan-ozal/browser-devtools-mcp server expose?
io.github.serkan-ozal/browser-devtools-mcp exposes 51 tools: a11y_take-aria-snapshot, a11y_take-ax-tree-snapshot, content_get-as-html, content_get-as-text, content_save-as-pdf, and 46 more. Their descriptions and schemas cost roughly 7,792 tokens of context every time the server is loaded.
Is the io.github.serkan-ozal/browser-devtools-mcp server still maintained?
io.github.serkan-ozal/browser-devtools-mcp is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.serkan-ozal/browser-devtools-mcp server under?
io.github.serkan-ozal/browser-devtools-mcp declares the Elastic-2.0 licence, which is not on the OSI-approved list. Read the terms before using it at work, and note this covers the source only, not the cost of any service it calls.