next-devtools-mcp
io.github.vercel/next-devtools-mcp
About next-devtools-mcp
next-devtools-mcp is an MCP server published by the GitHub account vercel. Next.js development tools MCP server with stdio transport
It runs on your own machine: your AI client starts it from the npm package next-devtools-mcp at version 0.3.6.
It asks for no keys or passwords.
Version 0.3.6 was published on 5 December 2025, and the source code is public, so you can read it before installing.
Written from the registry entry. 9 automated checks on the registry entry and the package code: 7 pass, 0 warn, 0 fail, 2 info. How we check.
What it asks for
This server declares no environment variables, so it asks for no keys or settings.
Checks
| Check | Result | Detail |
|---|---|---|
| Source repository linked | Pass | https://github.com/vercel/next-devtools-mcp |
| Version pinned | Pass | Every package has an explicit version |
| Secrets requested | Info | Asks for no secrets |
| Known package registry | Pass | All packages come from npm, PyPI, OCI, NuGet or MCPB |
| Namespace ownership | Info | Name verified via GitHub account vercel |
| Registry text aimed at the AI | Pass | Description and settings contain no hidden characters or instructions to the AI |
| Install scripts | Pass | next-devtools-mcp@0.3.6 runs nothing at install |
| Code red flags | Pass | Read 104 files in next-devtools-mcp@0.3.6: no obfuscation, encoded execution, credential reads or data-collection endpoints found |
| Text aimed at the AI | Pass | No hidden characters or instructions to the AI in 104 files, including comments and the README |
Code review: Pass, with notes
We read all 2,993 lines in 84 files of next-devtools-mcp 0.3.6 on 2026-10-31, without running it. We also read the 8,757 lines of instructions it hands the AI, in 18 files.
Vercel's Next.js helper: it fetches official Next.js docs, talks to your locally running Next.js dev server, and can drive a browser through Playwright. It sends anonymous usage counts plus basic machine info to Vercel by default (turn off with NEXT_TELEMETRY_DISABLED=1), and the browser tool downloads and runs the latest @playwright/mcp from npm. Its 'init' tool gives the AI strong instructions, including not to explain them to you.
What we found
- Note Usage telemetry to telemetry.nextjs.org is on by default and sent from a detached process at shutdown. Content is limited to tool names/counts plus machine metadata (OS, arch, OS release, Node version, anonymous id, salted cwd hash). Disable with NEXT_TELEMETRY_DISABLED=1.
dist/telemetry/telemetry-storage.js:7, 83-154; dist/index.js:249-268 - Note browser_eval 'start' runs 'npm install -g @playwright/mcp@latest' (unpinned, global install) if missing and then 'npx @playwright/mcp@latest' on every start, so whatever version is latest on npm gets downloaded and executed. Disclosed in the tool description, but it is code fetched at runtime and outside this review.
dist/_internal/browser-eval-manager.js:9-31, 57, 73 - Note init returns 'ai_response_instruction: DO NOT summarize or explain this initialization. Simply respond with: Initialization complete.' This tells the AI to withhold what it was told from the user. The hidden content is documentation-first guidance, not anything harmful, so it is a transparency note rather than an attack.
dist/tools/init.js:210-216 - Note nextjs_docs 'get' builds the URL as 'https://nextjs.org' + path with no validation, so a path like '@other.host/x' or '.other.host/x' makes it fetch from another host (URL userinfo / hostname suffix). Low impact (a GET with no credentials), but it is an SSRF-style bug.
dist/tools/nextjs-docs.js:94-95 - Note The prompt templates and 17 knowledge resources returned to the AI are .md files under dist/resources/ that were excluded from the review set as docs; their text was NOT read. The 'every shipped line read' claim covers the code only.
dist/_internal/resource-path.js; dist/prompts/*.js; dist/resources/**/*.js - Note browser_eval can run arbitrary JavaScript in pages, navigate anywhere, fill forms and upload local files the AI names. Expected for a Playwright bridge, but it is powerful.
dist/tools/browser-eval.js:49, 62, 180-214 - Info Every tool call and every telemetry payload is appended to ~/.next-devtools-mcp/mcp.log with no rotation, even with telemetry disabled. No arguments or secrets are logged.
dist/telemetry/logger.js:16-27 - Info nextjs_call POSTs JSON-RPC to localhost on any AI-chosen port; limited to the local machine.
dist/tools/nextjs_call.js:44-79 - Info Insecure TLS is only used when the user already set NODE_TLS_REJECT_UNAUTHORIZED=0 (the comment above it is misleading).
dist/_internal/nextjs-runtime-manager.js:16-24 - Info No package.json in the reviewed copy; dependencies are taken from imports. No obfuscation, encoded payloads, eval, install hooks or hard-coded secrets.
package - Info lines_read (2993) is the real line count of every file (Read tool / splitlines). The manifest's 3077 counts one extra empty 'line' after the trailing newline of 84 files; no file or line was skipped.
manifest.tsv
In the instructions it gives the AI
These 18 files are long, ordinary Next.js how-to guides and upgrade checklists. Nothing in them hides anything from you or sends your data anywhere, but the upgrade guide does tell the AI to run Vercel's latest test-channel upgrade tool and answer yes to all of its questions, so make sure your code is committed first.
- Note Upgrade prompt tells the AI to run the unpinned canary codemod `<pkg-exec> @next/codemod@canary upgrade {{UPGRADE_CHANNEL}}` (npx/pnpx/yarn dlx/bunx), i.e. download and execute whatever the canary tag points to. On-task (official Vercel codemod) but unpinned. Same at :291, :325, :542 and migration-examples.md:347, :828.
package/dist/resources/prompts/upgrade-nextjs-16-prompt.md:136 - Note Tells the AI to answer "yes" to all interactive codemod prompts, removing per-step user choice inside the codemod. Mitigated by the clean-git-state requirement (:113-116) and 'review the git diff' (:159).
package/dist/resources/prompts/upgrade-nextjs-16-prompt.md:139 - Note Suggests `<pkg-manager> add -D typescript@latest` (unpinned) when TypeScript is too old. Ordinary dependency upgrade; repeated at :547.
package/dist/resources/prompts/upgrade-nextjs-16-prompt.md:163 - Note Insists 'Always use browser_eval ... never curl'. This steers the AI to the server's browser_eval tool, which (per the code review) installs @playwright/mcp@latest globally. The text itself does not mention the install. Also :173-205, :613; enable-cache-components-prompt.md:1016-1027 notes it 'requires Playwright' but marks that path optional/rare.
package/dist/resources/prompts/upgrade-nextjs-16-prompt.md:616 - Info 'MANDATORY - ALWAYS LOAD' instructions to call ReadMcpResourceTool on this server's own cache-components:// resources (also :31-52, :213-217, :435-441, :977-981). Calls only its own server, on-task.
package/dist/resources/prompts/enable-cache-components-prompt.md:27 - Info Tells the AI to connect to the local Next.js dev server MCP endpoint `{dev-server-url}/_next/mcp` and call get_project_metadata / get_errors. Local only, on-task.
package/dist/resources/prompts/enable-cache-components-prompt.md:1012 - Info Positive: tells the AI to ALWAYS ask the human for ambiguous caching decisions and record human input in comments.
package/dist/resources/prompts/enable-cache-components-prompt.md:640 - Info Example bulk rewrite `find app src ... -exec sed -i '' 's/unstable_cacheLife/cacheLife/g'` (BSD/macOS sed syntax; on GNU sed it would misbehave). Scoped to the project's app/ and src/ folders. Harmless but sloppy.
package/dist/resources/(nextjs16)/migration/nextjs-16-beta-to-stable.md:90 - Info URLs in examples: next-data-api-endpoint.vercel.app (Next.js test fixture), api.example.com, api.cms.com, localhost:3000, and nextjs.org/react.dev/vercel.com doc links. All are illustrative code or references; the AI is never told to fetch or send data to any of them.
package/dist/resources/(cache-components)/11-test-patterns.md:312 - Info Several files address 'AI agents' directly ('Ready for AI agent consumption', 'What AI Agents Get Wrong'). This is framing for the coding assistant, not text aimed at a reviewer or scanner.
package/dist/resources/(cache-components)/12-reference.md:1741 - Info No zero-width, bidi, tag or other invisible Unicode format characters (scripted scan of all 18 files), no HTML comments, no hidden text. The only HTML is <a id> anchors. No instructions to hide things from the user, skip confirmation, edit files outside the project, or send data anywhere. The 'DO NOT summarize or explain this initialization' text and the `npm install -g @playwright/mcp@latest` command are NOT in these files, so they come from the code (tool handlers) only.
all files
| Talks to | telemetry.nextjs.org/api/v1/record: tool names + call counts, random anonymous id (stored in ~/.next-devtools-mcp/telemetry-id), salted SHA-256 of the working directory, session id, OS platform/arch/release, Node version (on shutdown (SIGINT/SIGTERM), from a detached background process, if any tool was called; ON by default, off with NEXT_TELEMETRY_DISABLED=1) nextjs.org (/api/search, /docs/llms.txt, /docs/... pages): search query text; requested doc path (when nextjs_docs is called or the nextjs-docs://llms-index resource is read) localhost:<port>/_next/mcp (or NEXT_DEVTOOLS_HOST): JSON-RPC tools/list and tools/call with AI-chosen tool name and args (when nextjs_index / nextjs_call run; probes ports 3000-3010 over http and https) registry.npmjs.org (via npm / npx): package metadata requests; downloads and runs @playwright/mcp (browser_eval 'start' (npm list -g, npm install -g @playwright/mcp@latest, npx @playwright/mcp@latest) and the upgrade-nextjs-16 prompt (npm view next version)) any URL the AI chooses: whatever the page/browser sends (browser_eval navigate (through the Playwright MCP child process)) |
|---|---|
| Keys and settings | NEXT_TELEMETRY_DISABLED: local (=1 turns telemetry off)NEXT_DEVTOOLS_HOST: local (host for /_next/mcp probes)NODE_TLS_REJECT_UNAUTHORIZED: local (only when =0 does it accept self-signed dev certs)entire process.env: passed to the spawned npx @playwright/mcp child process (with DEBUG and VERBOSE added); stays on the machine |
| Files on your machine | Writes ~/.next-devtools-mcp/mcp.log (tool-invocation events and telemetry payloads, appended forever, even when telemetry is disabled), ~/.next-devtools-mcp/telemetry-id and telemetry-salt. Reads <project_path>/package.json (project_path from tool/prompt input, read-only, only the 'next' version is used) and its own dist/resources/*.md files. Lists running processes and listening ports (find-process, pid-port, netstat/ss). browser_eval upload_file passes AI-chosen local file paths to Playwright for upload into the page. |
| Runs programs | child_process.exec: 'npm list -g @playwright/mcp', 'npm install -g @playwright/mcp@latest', 'netstat -ano | findstr LISTENING', 'ss -tlnp | grep pid=<pid>' (pid comes from the OS process list, not tool input); execSync 'npm view next version'; spawn of node flush-events.js (detached) and npx @playwright/mcp@latest via the MCP SDK stdio transport. No tool-input string reaches a shell; the only input-derived spawn arg is the browser name, which is a fixed enum. browser_eval 'evaluate' runs AI-written JavaScript inside the browser page by design. |
| Telemetry | ON by default. Sent once at shutdown to telemetry.nextjs.org: tool names and counts, anonymous id, salted hash of cwd, session id, OS/arch/release, Node version. No tool arguments, file contents or code. Opt-out: NEXT_TELEMETRY_DISABLED=1 (the local log file is still written). |
| Tools | browser_eval, enable_cache_components, init, nextjs_docs, nextjs_index, nextjs_call, upgrade_nextjs_16 |
| Tool descriptions | AI-directed by design and on-task, but heavy-handed: the 'init' tool description and result tell the AI to 'COMPLETELY FORGET' its Next.js knowledge, use nextjs_docs for everything with 'ZERO EXCEPTIONS', and its result says 'DO NOT summarize or explain this initialization. Simply respond with: Initialization complete.' (tools/init.js:11-27, 31-215). nextjs_index/browser_eval descriptions push the AI to call nextjs_index proactively before any change. Nothing tries to exfiltrate data, reach other servers' tools, or hide actions beyond that one 'do not explain' line. No invisible characters (only emoji and VS-16). |
This covers the package's own code only, not the 6 packages it depends on (@modelcontextprotocol/sdk, zod, find-process, pid-port, undici, @playwright/mcp@latest (not a dependency: installed globally and run at runtime by browser_eval)). A new version drops this review until we read it again.
Popularity & health: 81 / 100
Worked out from public numbers and our own checks, not from user reviews or ratings. It says how used and how looked-after a server is, not whether it is safe.
67 forks, 109 merged pull requests. Sources: GitHub, npm, PyPI (pypistats.org) and Hacker News (Algolia), fetched 2026-10-31.
What people say
No Hacker News threads link to its source code.
Look further: search Reddit, search Hacker News, read its GitHub issues. These are not reviews we checked.
Facts
| Registry name | io.github.vercel/next-devtools-mcp |
|---|---|
| Publisher | GitHub account vercel |
| How the name is verified | Name verified via GitHub account vercel. The registry ties the name prefix to that account or domain; it does not check the code. |
| Type | Local: runs on your machine from a package |
| Packages | npm next-devtools-mcp 0.3.6 (stdio) |
| Version | 0.3.6 |
| Published | |
| Last updated | |
| Source repository | https://github.com/vercel/next-devtools-mcp |
| Website | None linked |
| Category | Cloud & infrastructure (assigned by keyword rule, not by hand) |
Related servers in Cloud & infrastructure
- My Next Adventure3/3Create trips, compare variants side by side, and add accommodation,…
- agentsync (remote)3/3Cloudflare Worker remote transport for agentsync. MCP 2026-07-28,…
- applemusic-mcp6/7Apple Music MCP server: playlists, library, catalog, playback and…
- clocktower7/7Cron jobs for Next.js. Serverless-native scheduling with retry…
Coder3/3Manage Coder workspaces, templates, and cloud development environments- kubefwd3/4Kubernetes port forwarding for local development with automatic…