Atlas / MCP servers / vercel / mcp-handler

mcp-handlerSAFE

mcp/vercel/mcp-handler

Easily spin up an MCP Server on Next.js, Nuxt, Svelte, and more

Verdict
SAFE
Grade
B
Trust score
86 /100
Exposed tools
4 4r · 0w · 0d
Transport
streamable-http
License
—
Stars
684
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

mcp-handler is a framework-agnostic HTTP adapter for hosting Model Context Protocol (MCP) servers in JavaScript and TypeScript applications. It turns an MCP server definition into a Web-standard (Request) => Promise handler that can be mounted in Next.js, Nuxt/Nitro, SvelteKit, Hono, and other Fetch-compatible frameworks.

Built on MCP SDK v2, it serves the 2026-07-28 MCP specification natively while transparently falling back to stateless Streamable HTTP for 2025-era clients — one handler, both protocol generations.

Installation

npm install mcp-handler@^2 @modelcontextprotocol/server@^2 zod@^4
Note: mcp-handler 2.x requires the MCP SDK v2 packages (@modelcontextprotocol/server ^2.0.0), zod ^4.2.0, and Node.js 20+. If you're on @modelcontextprotocol/sdk 1.x, use mcp-handler 1.x.

Framework Compatibility

createMcpHandler returns a Web-standard request handler, so the package is not tied to Vercel or any particular framework. It can be mounted in:

  • Next.js Route Handlers
  • Nuxt/Nitro server handlers using fromWebHandler
  • SvelteKit server routes
  • Hono
Read from source at commit 17e765065600OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add mcp-handler -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "mcp-handler": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Exposed tools (4)

4 read · 0 write · 0 destructive.

ToolRiskDescription
echoread
issue.createdreadNew issues
roll_diceread
secretread
04

Trust audit

SAFEgrade B · trust 86/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (1 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (8)

MEDIUMAuth / authz · mcp.remote_no_auth · CWE-287, CWE-862
streamable-http
Why it matters. a network transport with no auth environment variable found
Fix. require a token
LOWInventory / provenance · inv.no_license · CWE-1104
Why it matters. no LICENSE file and no repo licence
Fix. add a licence
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/webmcp-script.test.ts:62
new Function("document", "navigator", "fetch", "console", script)(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/webmcp-script.test.ts:236
const handler = new Function(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/webmcp.test.ts:123
new Function("navigator", "document", script)(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/webmcp.test.ts:159
new Function("navigator", "document", script)(undefined, undefined),
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/events/register.ts:263
const decoded = atob(encoded);
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
chalk, commander, @changesets/cli, @modelcontextprotocol/client, @modelcontextprotocol/server, @types/node, tsup, typescript
Why it matters. 10 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass, no_license.

Audited 2026-10-12 · audit v0.4.1 · source sha 17e765065600full audit observations/trust-audit/mcp-server/vercel__mcp-handler.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1217e765065600SAFEB86first audit
06

Questions

What is the mcp-handler MCP server?

Easily spin up an MCP Server on Next.js, Nuxt, Svelte, and more

What tools does mcp-handler expose?

4 in total: 4 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is mcp-handler safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (86/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does mcp-handler need?

No credential environment variables were found in its source, so it appears to need none.

How does mcp-handler run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as mcp-handler at 2.3.0.

How current is this page?

The grade is for one exact copy of the source (17e765065600), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement