Announcing Beacon: Self-improving memory for coding agents
← All MCP servers
MCP server

io.github.vercel/next-devtools-mcp

mcp:vercel/next-devtools-mcp

Next.js development tools MCP server with stdio transport

Verdict
Inconclusive

The analysis could not cover enough of the artifact to decide.

Analyzed Oct 26, 2026, 12:17 UTC at 1e8dcfa

Dispute security verdict

If you believe this verdict is incorrect, submit a dispute and we'll review it.

0
findings
—
highest severity
0
threat classes
67
files scanned
336/336
checks satisfied
0
package advisories

Why this verdict

  • inconclusive: gap invalid_judge_finding
  • inconclusive: gap no_tools_extracted at package.json
  • inconclusive: gap request_unanswered
  • inconclusive: unresolved question on EXEC
  • inconclusive: unresolved question on EXFIL

Security findings 0

No individual findings recorded

The inconclusive verdict rests on the open questions and coverage gaps below; 4 candidate findings were refuted on review.

Open questions 2

What the analysis could not settle from the code alone.

Where does telemetryStorage.sendEvents send data, and is there an opt-out? The destination and payload are not visible in the shown units.
Data exfiltration
[file request src/tools/browser-eval.ts] What install and usage instructions does browser_eval return to the agent? Does it direct the agent to run a remote or unpinned installer, or to run commands without user confirmation?
Code execution
Refuted findings 4

Candidates the review stage examined and rejected, kept for transparency.

Data exfiltration

criticalRefutedmedium confidence

On shutdown the server spawns a detached, silent child process (flush-events.js) with aggregated tool-usage counts as an argument, which sends them to a telemetry endpoint via telemetryStorage.sendEvents; the data is limited to tool names and counts, but the detached background send is not declared in server.json.

detached: true,
Why it was refuted

The detached flusher only sends tool names and invocation counts to the vendor's own telemetry endpoint. That is limited vendor usage telemetry, not exfiltration of sensitive data, and the same send path honours the NEXT_TELEMETRY_DISABLED opt-out.

Data exfiltration

criticalRefutedmedium confidence

The server undeclared-ly posts usage telemetry (persistent anonymous ID, salted hash of the working directory, OS/arch/node version, tool usage counts) to telemetry.nextjs.org, with opt-out only via NEXT_TELEMETRY_DISABLED=1; the data is limited and the destination is the vendor's own, so intent is plausibly honest.

const response = await fetch(TELEMETRY_ENDPOINT, {
Why it was refuted

This is default-on vendor telemetry with an explicit opt-out. The payload is an anonymous ID, a salted hash of the working directory, system info and tool counts, with no source or credential data, so the harm gate fails.

Data exfiltration

criticalRefutedmedium confidence

TelemetryStorage builds a payload of persistent anonymous ID, salted hash of the working directory, and OS/arch/node version, and POSTs it to telemetry.nextjs.org unless NEXT_TELEMETRY_DISABLED=1; it is on by default and sends no source or credential data.

const TELEMETRY_ENDPOINT = "https://telemetry.nextjs.org/api/v1/record"
Why it was refuted

The endpoint constant is the vendor telemetry target. The code sends only an anonymous ID, a salted one-way hash of the cwd and system info, and honours an opt-out, so no sensitive data leaves.

Supply chain

highRefutedlow confidence

The browser_eval tool tells the agent to globally install the unpinned 'agent-browser' npm package and then load usage instructions from that CLI at runtime, so unpinned remote code and instructions drive the agent; this is disclosed in the tool description and is the tool's stated purpose.

const INSTALL_COMMAND = "npm install -g agent-browser"
Why it was refuted

The tool description states that it tells the agent how to install agent-browser. Pointing to the install command is the tool's declared core purpose, so the behavior is not undeclared. The package is a vercel-labs CLI.

Coverage gaps 4

Parts of the artifact the static analysis could not fully examine.

context:unanalyzable_binary binary content is only byte-scanned
test/fixtures/nextjs14-minimal/app/favicon.ico
no_tools_extracted MCP server target with no statically extractable tools/prompts/resources
package.json
request_unanswered request.0: instruction-surface.1/browser-eval-1: finding: citation not shown or quote not in it
invalid_judge_finding request.0