scenescout@3.35.0
CAUTION· startup onlyPublisher claims: "SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
- Not tested
- the tool list (the server exited before answering) · what the tools do when called with real credentials
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
EXPORT_TOKENGH_TOKENGITHUB_TOKENJIRA_API_TOKENLIVE_TOKEN_FILENO_CREDENTIALSor--max-tokensConfiguration, not credentials: CLAUDE_CONFIG_DIR, ComSpec, DISPLAY, GITHUB_ACTIONS, GITHUB_API_URL, GITHUB_STEP_SUMMARY, GITHUB_WORKFLOW_REF, GITHUB_WORKSPACE, JIRA_BASE_URL, JIRA_EMAIL, JIRA_ISSUE_TYPE, JIRA_LINK_TYPE, JIRA_PROJECT_KEY, LEAVE_MARKER_PATH, PATHEXT, SCENESCOUT_WATCHDOG_MS, SSH_CONNECTION, SSH_TTY, WAYLAND_DISPLAY, XPATH_OF_SRC- Where it talks to
- no vendor host named in the codeAlso schemastore.org, atlassian.net, azure.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- the tool list (the server exited before answering) · what the tools do when called with real credentials
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names schemastore.org, atlassian.net, azure.com as well as its own vendor. The guard injects EXPORT_TOKEN, GH_TOKEN, GITHUB_TOKEN, JIRA_API_TOKEN, LIVE_TOKEN_FILE, NO_CREDENTIALS only into requests to the host you bind (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; startup only; authenticated tool behavior not tested) on 2026-11-14 and scored it 75/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 29 s · 2 scenarios · 0 deviationsStatic findings
// a checkout nor an npx run leaves the command on PATH. Not having it costsFix: Pin versions and sources; vendor anything fetched at install time.* repository holds `.env`. Credential-shaped paths are therefore refused byFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.o.log(` turn ${spend.turns}: ${turn.calls.map((c) => c.name || "(unnamed)").join(", ")} — ${(spend.usage.input + spend.usage.output).toLocaleString("en-US")} tokens so far`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.const { [OPEN_ENV]: _setting, ...env } = deps.env;Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return fromCheckout ? `node dist/cli.js install ${flags}` : `npx -y scenescout install ${flags}`;Fix: Pin versions and sources; vendor anything fetched at install time.console.log(`✗ Browser download failed — run \`npx playwright install ${missing.join(" ")}\` and check your network/proxy.`);Fix: Pin versions and sources; vendor anything fetched at install time.let cli = isEphemeralRoot(packageRoot) ? `npx -y ${CLI_NAME}` : `node ${path.join(packageRoot, "dist", "cli.js")}`;Fix: Pin versions and sources; vendor anything fetched at install time.* `~/.aws` does not make its files ordinary.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.log(`· Putting \`${CLI_NAME}\` on PATH skipped (--no-command). Until then the command is: ${cli}`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.const SECRET_FILE = /^(\.env.*|\.npmrc|\.netrc|\.pgpass|.*\.(pem|key|p8|p12|pfx|ppk|jks|keystore|asc|kdbx))$/i;Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.? githubApi(o.github, client(o.github.apiUrl, { ...credentials.headers, ...GITHUB_HEADERS }, http))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return fail(`Chromium could not be downloaded. Check the network or proxy and run this again, or download it by hand: npx playwright install ${downloads.join(" ")}`);Fix: Pin versions and sources; vendor anything fetched at install time.return electron ? { ...env, ELECTRON_RUN_AS_NODE: "1" } : env;Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.navigator.sendBeacon(url, "");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.return fail(`the download finished, but ${still.join(", ")} is still not where Playwright looks for it. Run: npx playwright install ${still.join(" ")}`);Fix: Pin versions and sources; vendor anything fetched at install time.? githubApi(o.github, client(o.github.apiUrl, { ...credentials.headers, ...GITHUB_HEADERS }, http))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…rigin), and a credential-shaped one (a dotfile or anything in a hidden folder, `.env*`, an SSH key, `*.pem`/`*.key`/`*.p8`/`*.p12`/`*.pfx`/`*.ppk`/`*.jks`/`*.keysto…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// avatar.png into .ssh/ and a link named .env to anything are both refused.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* An npx run executes from a cache directory that npm may delete at any time;Fix: Pin versions and sources; vendor anything fetched at install time.`On Linux, if system libraries are missing: npx playwright install --with-deps ${target}`);Fix: Pin versions and sources; vendor anything fetched at install time.out.push(needsSignInText(walled, `${code(`npx -y scenescout login ${shellArg(result.url)} --role <name>`)} saves a sign-in, and an agent run then attaches as that role`, "page"));Fix: Pin versions and sources; vendor anything fetched at install time.console.log(`· \`${CLI_NAME}\` was not put on PATH (${done.detail}). To do it by hand: ${done.manual}\n Until then the command is: ${cli}`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = await runCheck(options, (line) => console.log(line), inputs);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(`Checking ${options.url} …${inputs.flows.length > 0 ? ` (and ${inputs.flows.length} saved flow(s))` : ""}`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* plus the server script. From an npx run it must NOT be: the script then livesFix: Pin versions and sources; vendor anything fetched at install time.…=Save]' (never snapshot refs). The same steps, saved to .scenescout/flows/<name>.json with expect-text / expect-url / expect-request steps added, are replayed by `scenescout check` on every pull request. An `upload` step attaches a file as…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…e past that a site is usually paginating rather than showing new pages. ${code(`npx -y scenescout check ${shellArg(result.url)} --paths /a,/b`)} measures pages by nam…Fix: Pin versions and sources; vendor anything fetched at install time.` npx -y scenescout install --browser-only --browsers ${target}\n` +Fix: Pin versions and sources; vendor anything fetched at install time./* already gone or not ours to kill */Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.github: "npx -y scenescout export --to github --repo owner/app",Fix: Pin versions and sources; vendor anything fetched at install time.out.push(`The start page moved to ${to}, so its links count as another site's and were not followed. To look further, run it there: ${code(`npx -y scenescout ${shellArg(`${to}/`)}`)}.`);Fix: Pin versions and sources; vendor anything fetched at install time.// on Windows the SIGTERM a client sends next is a plain kill that runs noFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.const NEXT_LINE = "Next: let your coding agent explore it and file what it finds (npx -y scenescout install), gate pull requests with npx -y scenescout check in CI, " +Fix: Pin versions and sources; vendor anything fetched at install time.* silently stops working. There the launcher is `npx -y scenescout serve`,Fix: Pin versions and sources; vendor anything fetched at install time.…to a sign-in page, so this is what a visitor who is not signed in sees. ${code(`npx -y scenescout login ${shellArg(result.url)} --role <name>`)} saves a sign-in, so a…Fix: Pin versions and sources; vendor anything fetched at install time./** The release an npx launcher line pins, or null when it is unpinned or not this package's launcher. A pre-release such as `3.26.0-beta.1` counts. */Fix: Pin versions and sources; vendor anything fetched at install time./** Whether a registered argument line is this package's npx launcher: unpinned (older installs) or pinned to any release. */Fix: Pin versions and sources; vendor anything fetched at install time.jira: "npx -y scenescout export --to jira --jira-url https://your-site.atlassian.net --jira-project KEY",Fix: Pin versions and sources; vendor anything fetched at install time.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for scenescout@3.35.0 as of 2 h ago. This is the package itself, not its dependencies.
What would make this Verified
5 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim brunoboto96: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- navigator.sendBeacon()≈ +4 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.
- Process kill command≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.