Control a real Chrome browser to complete any task: fill forms, extract data, book flights.
Close the page
ArgumentsA call is made on an account: it counts against an allowance and the publisher sees it, which is why this one asks who you are first.
What it does
Microsoft's official Playwright MCP server with headless Chromium, hosted: your agent opens pages, reads them as accessibility snapshots, clicks, types, fills forms and takes screenshots. Built from the image mcr.microsoft.com/playwright/mcp (v0.0.82) and run on mcprush hosting: there is no endpoint to keep alive and nothing to deploy yourself. The browser runs in an isolated cloud container, so it reaches public HTTPS sites only: not your localhost, your intranet, plain http:// pages or your own logged-in sessions, and every session starts logged out. Screenshots and snapshots come back in the answer; files it saves are gone when the server stops after 15 idle minutes. The image is pinned, so what answers today is what answered yesterday.
Quickstart
# 1 — buy it first ($29 a month): mcprush.com/checkout?server=playwright-browser-hosted-mcp
# a key alone is not enough: the gateway refuses every call until it is bought
# 2 — sign in with a key of the account that bought it: npx mcprush@latest login
# the key is at mcprush.com/dashboard#access
# 3 — install
npx mcprush@latest add mcpdevpro/playwright-browser-hosted-mcp
# 4 — ask your agent for something these tools do
# browser_close, browser_resize, browser_console_messages and 22 more
Windows PowerShell says 'running scripts is disabled on this system'? Run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned once, or type npx.cmd instead of npx (codex.cmd, gemini.cmd, grok.cmd likewise). PowerShell 7 needs neither.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine — this server runs on infrastructure we host behind our gateway, and what you install is the connection to it.
Claude Code has its own MCP command, and the key rides on it as a header — the gateway refuses a call that carries none. Claude Code reads MCPRUSH_KEY each time it connects, so the key stays out of its config: export your key from Access in your shell profile (macOS, Linux), or run setx MCPRUSH_KEY <your key> and open a new terminal (Windows). Or let npx mcprush@latest add mcpdevpro/playwright-browser-hosted-mcp write the entry with the key for you; --scope user makes it available in every project. The first connection after a quiet spell starts the server, which takes up to a minute: if your client says it failed to connect, reconnect after that (/mcp in Claude Code).
Buy it first — $29 a month. A key alone is not enough: until this account has bought it, the gateway refuses every call. Subscribe, then use a key of the account that bought it.
claude mcp add --transport http --scope user playwright-browser-hosted-mcp https://mcprush.com/gw/playwright-browser-hosted-mcp/mcp --header 'Authorization: Bearer ${MCPRUSH_KEY}'Reconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing at the gateway. The server itself runs on infrastructure we host, so nothing from this listing executes on your machine.
25 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Close the page
No parameter schema on file.
Resize the browser window
| Parameter | Type | Required | Notes |
|---|---|---|---|
| width | number | yes | Width of the browser window |
| height | number | yes | Height of the browser window |
Returns all console messages
| Parameter | Type | Required | Notes |
|---|---|---|---|
| level | string | yes | Level of the console messages to return. Each level includes the messages of more severe levels. Defaults to "info". |
| all | boolean | no | Return all console messages since the beginning of the session, not just since the last navigation. Defaults to false. |
| filename | string | no | File name to save the console messages to. Relative file names are resolved against the workspace root. If not provided, messages are returned as text. |
Handle a dialog
| Parameter | Type | Required | Notes |
|---|---|---|---|
| accept | boolean | yes | Whether to accept the dialog. |
| promptText | string | no | The text of the prompt in case of a prompt dialog. |
Emulate CSS media features for the page, for example switch between the light and dark color scheme. Omitted parameters are left unchanged; null clears an override.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| colorScheme | no | Emulates the prefers-color-scheme media feature | |
| reducedMotion | no | Emulates the prefers-reduced-motion media feature | |
| forcedColors | no | Emulates the forced-colors media feature | |
| contrast | no | Emulates the prefers-contrast media feature | |
| media | no | Changes the CSS media type of the page |
Evaluate JavaScript expression on page or element
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element | string | no | Human-readable element description used to obtain permission to interact with the element |
| target | string | no | Exact target element reference from the page snapshot, or a unique element selector |
| function | string | yes | () => { /* code */ } or (element) => { /* code */ } when element is provided |
| filename | string | no | File name to save the result to. Relative file names are resolved against the workspace root. If not provided, result is returned as text. |
Upload one or multiple files
| Parameter | Type | Required | Notes |
|---|---|---|---|
| paths | array | no | The absolute paths to the files to upload. Can be single file or multiple files. If omitted, file chooser is cancelled. |
Drop files or MIME-typed data onto an element, as if dragged from outside the page. At least one of "paths" or "data" must be provided.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element | string | no | Human-readable element description used to obtain permission to interact with the element |
| target | string | yes | Exact target element reference from the page snapshot, or a unique element selector |
| paths | array | no | Absolute paths to files to drop onto the element. |
| data | object | no | Data to drop, as a map of MIME type to string value (e.g. {"text/plain": "hello", "text/uri-list": "https://example.com"}). |
Search the accessibility snapshot of the current page for text or a regular expression. Returns matching snapshot nodes with a few lines of surrounding context (like search snippets), each shown under its path from the root of the tree, which is cheaper than capturing the whole snapshot when you only need to locate an element and its ref.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| text | string | no | Plain text to search for in the page snapshot (case-insensitive substring match). Provide either text or regex, not both. |
| regex | string | no | Regular expression to search for in the page snapshot. Matching is case-sensitive by default; wrap the pattern in slashes to add flags, e.g. "/error/i" for case-insensitive. Provide either text or reg |
Fill multiple form fields
| Parameter | Type | Required | Notes |
|---|---|---|---|
| fields | array | yes | Fields to fill in |
Press a key on the keyboard
| Parameter | Type | Required | Notes |
|---|---|---|---|
| key | string | yes | Name of the key to press or a character to generate, such as ArrowLeft or a |
Type text into editable element
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element | string | no | Human-readable element description used to obtain permission to interact with the element |
| target | string | yes | Exact target element reference from the page snapshot, or a unique element selector |
| text | string | yes | Text to type into the element |
| submit | boolean | no | Whether to submit entered text (press Enter after) |
| slowly | boolean | no | Whether to type one character at a time. Useful for triggering key handlers in the page. By default entire text is filled in at once. |
Navigate to a URL
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | The URL to navigate to |
Go back to the previous page in the history
No parameter schema on file.
Returns a numbered list of network requests since loading the page. Use browser_network_request with the number to get full details.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| static | boolean | yes | Whether to include successful static resources like images, fonts, scripts, etc. Defaults to false. |
| filter | string | no | Only return requests whose URL matches this regexp (e.g. "/api/.*user"). |
| filename | string | no | File name to save the network requests to. Relative file names are resolved against the workspace root. If not provided, requests are returned as text. |
Returns full details (headers and body) of a single network request, or a single part if part is set. Use the number from browser_network_requests.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| index | integer | yes | 1-based index of the request, as printed by browser_network_requests. |
| part | string | no | Return only this part of the request. Omit to return full details. |
| filename | string | no | File name to save the result to. Relative file names are resolved against the workspace root. If not provided, output is returned as text. |
Run a Playwright code snippet. Unsafe: executes arbitrary JavaScript in the Playwright server process and is RCE-equivalent.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| code | string | no | A JavaScript function containing Playwright code to execute. It will be invoked with a single argument, page, which you can use for any page interaction. For example: `async (page) => { await page.get |
| filename | string | no | Load code from the specified file. Relative file names are resolved against the workspace root. If both code and filename are provided, code will be ignored. |
Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element | string | no | Human-readable element description used to obtain permission to interact with the element |
| target | string | no | Exact target element reference from the page snapshot, or a unique element selector |
| type | string | no | Image format for the screenshot. If unset, inferred from the filename extension, otherwise png. |
| filename | string | no | File name to save the screenshot to. Relative file names are resolved against the workspace root. If not specified, the screenshot is saved into the output directory as `page-{timestamp}.{png|jpeg|web |
| fullPage | boolean | no | When true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots. |
| scale | string | yes | Image resolution scale. "css" produces a screenshot sized in CSS pixels (smaller, consistent across devices). "device" produces a high-resolution screenshot using device pixels (larger, accounts for t |
Capture accessibility snapshot of the current page, this is better than screenshot
| Parameter | Type | Required | Notes |
|---|---|---|---|
| target | string | no | Exact target element reference from the page snapshot, or a unique element selector |
| filename | string | no | Save snapshot to a file instead of returning it in the response. Relative file names are resolved against the workspace root. |
| depth | number | no | Limit the depth of the snapshot tree |
| boxes | boolean | no | Include each element's bounding box as [box=x,y,width,height] in the snapshot. Coordinates are viewport-relative, in CSS pixels (Element.getBoundingClientRect) |
Perform click on a web page
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element | string | no | Human-readable element description used to obtain permission to interact with the element |
| target | string | yes | Exact target element reference from the page snapshot, or a unique element selector |
| doubleClick | boolean | no | Whether to perform a double click instead of a single click |
| button | string | no | Button to click, defaults to left |
| modifiers | array | no | Modifier keys to press |
Perform drag and drop between two elements
| Parameter | Type | Required | Notes |
|---|---|---|---|
| startElement | string | no | Human-readable source element description used to obtain the permission to interact with the element |
| startTarget | string | yes | Exact target element reference from the page snapshot, or a unique element selector |
| endElement | string | no | Human-readable target element description used to obtain the permission to interact with the element |
| endTarget | string | yes | Exact target element reference from the page snapshot, or a unique element selector |
Hover over element on page
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element | string | no | Human-readable element description used to obtain permission to interact with the element |
| target | string | yes | Exact target element reference from the page snapshot, or a unique element selector |
Select an option in a dropdown
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element | string | no | Human-readable element description used to obtain permission to interact with the element |
| target | string | yes | Exact target element reference from the page snapshot, or a unique element selector |
| values | array | yes | Array of values to select in the dropdown. This can be a single value or multiple values. |
List, create, close, or select a browser tab.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| action | string | yes | Operation to perform |
| index | number | no | Tab index, used for close/select. If omitted for close, current tab is closed. |
| url | string | no | URL to navigate to in the new tab, used for new. |
Wait for text to appear or disappear or a specified time to pass
| Parameter | Type | Required | Notes |
|---|---|---|---|
| time | number | no | The time to wait in seconds |
| text | string | no | The text to wait for |
| textGone | string | no | The text to wait for to disappear |
- 50,000 calls a month, included
- 120 calls a minute at peak
- Every tool the listing has
- Cancel any time — the unused days are credited
- Runs behind the gateway, so cancelling stops it
What counts against the 50,000 calls a month on Starter
| Tool | Unit | Calls used | Out of the monthly allowance |
|---|---|---|---|
| browser_close | write | 2 | 0.0040% |
| browser_resize | write | 2 | 0.0040% |
| browser_console_messages | call | 1 | 0.0020% |
| browser_handle_dialog | write | 2 | 0.0040% |
| browser_emulate_media | write | 2 | 0.0040% |
| browser_evaluate | write | 2 | 0.0040% |
| browser_file_upload | write | 2 | 0.0040% |
| browser_drop | write | 2 | 0.0040% |
Failed calls, timeouts and anything the gateway rejects never count. When the allowance runs out the gateway returns an error naming the plan limit — nothing is billed beyond the subscription, ever.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | minimal | capability blast radius (minimal) — client exposure if the model is manipulated | −0 |
| verification-discount | vendor | publisher verification (official vendor) — published under a known vendor’s authority | −0 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
No tools were enumerated, so prompt-injection, capability and toxic-flow analysis had no tool surface to inspect. To grade a package’s real runtime tools, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. minimal is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| No per-tool rows for this release — see the note below. | ||
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
The gateway serves every install the publisher’s current release, so a release cannot be pinned or rolled back to here yet. The history below is for reading; the current release on file is 0.1.0.
- The version this listing went live with, after review.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Playwright Browser can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.