MCP server · Audited from source
Playwriter MCP server
by remorses/playwriterMIT licenceAudited 21 Sep 2026 · source d3e91f5401d4
Is it safe? With care — CAUTION, grade C (75/100). It exposes 2 tools: 0 read, 1 write and 1 destructive. The audit recorded 32 findings (0 critical, 0 high, 5 medium, 25 low). Maintainer's description: Chrome extension & CLI to let agents control your browser. Runs Playwright snippets in a stateful sandbox. Available as CLI or MCP
Cite
Cite this page
ModelsAtlas. “Playwriter MCP server (remorses/playwriter)”. Retrieved 21 Sep 2026. https://modelsatlas.com/mcp/remorses/playwriter
Trust audit
Audit 0.4.1 · full source read 21 Sep 2026
32 findings, listed below with the file and line each was found on. Grade A needs a sandboxed behavioural run too; this audit read the source only.
What the source does
- FilesystemDeclared6 observations
- NetworkDeclared5 observations
- ShellNone observedNothing seen in the source
- DependenciesNot pinnedSome ranges float
- SecretsFoundSee the findings
“Declared” means the server says it does this and the source agrees. Browser, file and shell access are expected of some kinds of server.
Five audit layers
| Layer | What we check | Result |
|---|---|---|
L0 Provenance | Repo owner, licence, archive status, activity | PASS 4 findings |
L1 Static source | Secrets, path traversal, supply chain | WARN 20 findings |
L2 Instructions | Prompt injection and authority framing in docs and tool descriptions | PASS |
L3 Inventory | Declared tools match the source | WARN 1 finding |
L4 Sandbox | Run in isolation and watch behaviour | SKIPPED |
Provenance & runtime
Who published it, and what the audit could and could not run
Provenance
- Repository owner
remorsesUser accountAccount type recorded when we read the repository. - PackagePublished on npm
website, no version recorded - LicenceMITFrom the repository, as read at the audited commit.
- Last push4 days agoActivity of the repository when we read it.
- Source commit readd3e91f5401d4The audit covers exactly this commit, read on 21 Sep 2026.
Runtime
- Sandbox runNot run yetThis audit read the source only; it did not execute the server.
- Tool inventory2 declaredRead from the source and classed read, write or destructive.
Every value here is read from the record's own repository and audit.Suggest a correction
Findings (32)
Sorted by severity · the 25 most severe of 32 are listed
MEDIUMInformation disclosuredisclose.log_secret · playwriter/src/cli.ts:1918
console.log(` Token: ${token ? '(configured)' : '(none)'}`)- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMInformation disclosuredisclose.log_secret · playwriter/src/cli.ts:1922
console.log(`CDP endpoint: http://${options.host}:${RELAY_PORT}${token ? '?token=<token>' : ''}`)- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMObfuscation / stealthobf.base64_blob · extension/vite.config.mts:53
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwCJoq5UYhOo5x8s50pVBUHjQ8idyUHnZFDj1JspWJPe6kvM7RFIaE/y5WTAH05kuK0R7v/ipcGA4ywA5wKdPKHZzkl5xstlNPj0Ivu4CqLobU7eY5G3k3Gq7wql2pbwb/A8Nat4VLbfBjQLA6TGWd3LQOHS
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMHard-coded secretssecret.generic · playwriter/src/recorder.test.ts:228
Excerpt withheld: it is a secret, and we never print one.
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMFilesystem / pathmcp.destructive_tools
reset
- Why
- 1 tool(s) can delete or overwrite
- Fix
- prefer a read-only mode or scoped tokens; the page states the blast radius
LOWCode injectioncode.eval_exec · playwriter/src/executor.unit.test.ts:190
expect(() => new Function(wrapped)).not.toThrow()
- Why
- evaluates text as code
- Fix
- remove; use a parser or a dispatch table
LOWCode injectioncode.eval_exec · playwriter/src/executor.unit.test.ts:196
expect(() => new Function(wrapped)).not.toThrow()
- Why
- evaluates text as code
- Fix
- remove; use a parser or a dispatch table
LOWCode injectioncode.eval_exec · playwriter/src/snapshot-tools.test.ts:314
const locatorFromString = eval('testPage.' + locatorString);- Why
- evaluates text as code
- Fix
- remove; use a parser or a dispatch table
LOWFilesystem / pathfs.traversal · extension/src/background.ts:42
import ghostCursorBundleCode from '../../playwriter/dist/ghost-cursor-client.js?raw'
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · extension/src/background.ts:45
import bippyBundleCode from '../../playwriter/dist/bippy.js?raw'
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · website/src/components/ui/button.tsx:8
import { cn } from '../../lib/utils.ts'- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · website/src/server.tsx:21
import playwriterSkillMd from '../../skills/playwriter/SKILL.md?raw'
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWNetwork egressnet.raw_ip · README.md:367
const browser = await chromium.connectOverCDP('http://127.0.0.1:19988')- Why
- No further detail recorded for this rule.
- Fix
- —
LOWNetwork egressnet.raw_ip · playwriter/CHANGELOG.md:739
- Allows `chromium.connectOverCDP('http://127.0.0.1:19988')` without needing to call `getCdpUrl` first- Why
- No further detail recorded for this rule.
- Fix
- —
LOWNetwork egressnet.raw_ip · playwriter/src/aria-snapshot.test.ts:54
baseUrl: `http://127.0.0.1:${address.port}`,- Why
- No further detail recorded for this rule.
- Fix
- —
LOWNetwork egressnet.raw_ip · playwriter/src/cli-help.test.ts:73
['src/cli.ts', 'session', 'new', '--host', `http://127.0.0.1:${port}`],- Why
- No further detail recorded for this rule.
- Fix
- —
LOWNetwork egressnet.raw_ip · playwriter/src/extension-connection.test.ts:39
const response = await fetch(`http://127.0.0.1:${TEST_PORT}/extension/status`)- Why
- No further detail recorded for this rule.
- Fix
- —
LOWObfuscation / stealthobf.decode_call · extension/src/background.ts:384
const binary = atob(value)
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWObfuscation / stealthobf.decode_call · website/src/components/cdp-screencast.tsx:289
const bin = atob(base64)
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWSupply chainsupply.unpinned · db/package.json
ulid, @types/node, typescript
- Why
- 3 dependency range(s) float
- Fix
- pin exact versions or ship a lockfile
LOWSupply chainsupply.unpinned · extension/package.json
string-dedent, zustand, @types/chrome, typescript, vite, vite-plugin-static-copy
- Why
- 6 dependency range(s) float
- Fix
- pin exact versions or ship a lockfile
Tools it exposes
2 declared in source · 1 destructive
1 tool can delete or overwrite. An agent that can be talked into calling a tool can be talked into calling this one, so give it a token scoped to what you need.
| Tool | Risk | What it does |
|---|---|---|
reset | destructive | No description in the source |
execute | write | No description in the source |
Install
audited commit d3e91f5
Read the findings first. The most severe is Information disclosure (medium) at playwriter/src/cli.ts.
One-click links open your editor with the config below filled in, exactly as the snippets show it. The audit covers commit d3e91f5 only.
claude mcp add website --env CLOUDFLARE_D1_TOKEN=${CLOUDFLARE_D1_TOKEN} --env PLAYWRITER_API_KEY=${PLAYWRITER_API_KEY} --env PLAYWRITER_CLOUD_TOKEN=${PLAYWRITER_CLOUD_TOKEN} --env PLAYWRITER_TOKEN=${PLAYWRITER_TOKEN} -- npx -y website{
"mcpServers": {
"website": {
"command": "npx",
"args": [
"-y",
"website"
],
"env": {
"CLOUDFLARE_D1_TOKEN": "${CLOUDFLARE_D1_TOKEN}",
"PLAYWRITER_API_KEY": "${PLAYWRITER_API_KEY}",
"PLAYWRITER_CLOUD_TOKEN": "${PLAYWRITER_CLOUD_TOKEN}",
"PLAYWRITER_TOKEN": "${PLAYWRITER_TOKEN}"
}
}
}
}The command does not pin a version; the audit covers commit d3e91f5401d4. Transport: stdio. Reads these environment variables: CLOUDFLARE_D1_TOKEN, PLAYWRITER_API_KEY, PLAYWRITER_CLOUD_TOKEN, PLAYWRITER_TOKEN. Give it the narrowest token it needs.
Audit history
- !CAUTION C 75 / 100
Source changed, verdict held ·
d3e91f5401d4
README badge
For maintainers · updates on every re-audit
[](https://modelsatlas.com/mcp/remorses/playwriter/)
The badge always shows the latest audit; a maintainer cannot pin an old verdict.
Other ratings
Cited, never blended into our score
No third-party security ratings are recorded for this server yet. When they exist they appear here with their source and date, beside, not inside, our grade.
Questions about Playwriter MCP server
What is the Playwriter MCP server?
What tools does Playwriter expose?
Is Playwriter safe to connect to an agent?
What credentials does Playwriter need?
How does Playwriter run?
How current is this page?
Sources
- remorses/playwriter on GitHub — the source we read, its licence, stars and activityObserved · 21 Sep 2026
- ModelsAtlas trust audit — CAUTION verdict for commit d3e91f5401d4Observed · 21 Sep 2026
Spotted something wrong? Report a correction · Methodology
Keep going in your AI
Opens with this page as the source. We add nothing else to the prompt.
- What is the Playwriter MCP server?
- What tools does Playwriter expose?
- Is Playwriter safe to connect to an agent?