mcp-remote CVE-2025-6514: how an OAuth URL from a server became a command on your machine

In mid-2025, connecting mcp-remote to the wrong MCP server could run a command on your computer. The fix shipped in 0.1.16. Here's what the primary sources say and how to check your setup.

The short answer

CVE-2025-6514 is a critical flaw (CVSS 9.6) in mcp-remote, the npm package many desktop MCP clients use to reach remote servers. Versions from 0.0.5 up to, but not including, 0.1.16 were exposed to OS command injection when connecting to an untrusted MCP server, through crafted input in the server’s authorization_endpoint URL. The fix is in 0.1.16.1 JFrog’s researchers, who reported it, recommend upgrading and connecting only to trusted servers over HTTPS.2

If any MCP config on your machine runs npx mcp-remote without a pinned version, check which version it actually runs.

Every MCP tool call goes through your rules first. Here a delete that doesn’t say which rows is stopped before it reaches the database. These are the rules deedglass init starts with; the call is made up.

What mcp-remote is

Some MCP clients only speak the stdio transport: they start a local process and talk to it over standard input and output. mcp-remote is a small proxy that lets those clients reach remote MCP servers over HTTP, handling the OAuth sign-in on the way. JFrog describes it as a popular tool used by MCP clients, letting applications that only support local stdio connect to remote servers.2 A typical config line:

Code Data in JSON, the format software uses to pass records and settings.

{ "command": "npx", "args": ["mcp-remote", "https://example.com/mcp"] }

That line runs whatever version npx resolves, on your machine, with your permissions.

What the advisory says

From GitHub’s advisory GHSA-6xpm-ggf7-wc3p:1

Field Value
Summary mcp-remote exposed to OS command injection via untrusted MCP server connections
CVE CVE-2025-6514
Severity Critical, 9.6
Affected >= 0.0.5, < 0.1.16
Patched 0.1.16
Fix commit 607b226 in geelen/mcp-remote

The npm registry lists 0.1.16 as published on 17 June 2025.4 JFrog’s write-up, by Or Peles, is dated 9 July 2025.2 When we ran npm view mcp-remote version on 26 October 2026, it printed 0.15.2.4

How the attack worked

The flaw sits in the OAuth step. When a client connects to a remote server that needs sign-in, the server tells the client where its authorization endpoint is, and the client opens that URL in a browser so the user can log in.

JFrog’s account: a malicious server returns a specially crafted authorization_endpoint value; mcp-remote passes it to the open package to launch a browser; and the crafted value causes command injection instead of opening a page.2

The effect differed by platform:2

Platform What the researchers showed
Windows Shell commands with full parameter control, through PowerShell
macOS and Linux Arbitrary executables with limited parameter control; full command execution “may be achievable” with more research

No click on a link was needed beyond connecting to the server. The server’s own metadata did the work.

Who was exposed

JFrog names two situations: connecting to a malicious or hijacked MCP server, and connecting over plain HTTP, where an attacker on the network could intercept the traffic and supply the crafted URL.2

So the realistic exposure was people who tried MCP servers from directories, blog posts or chat messages, or who connected to servers over http:// on shared networks. Connecting only to servers you run, over HTTPS, kept the risk low even on an affected version, which is why JFrog’s second recommendation is trusted servers over HTTPS.

Check your machine

Find every config that runs it. On macOS, the usual places are the Claude Desktop config, Cursor’s, VS Code’s and project files:

Code Commands typed in a terminal. The text around it says what happens.

grep -rl "mcp-remote" \
  ~/Library/Application\ Support/Claude/claude_desktop_config.json \
  ~/.cursor/mcp.json ~/.claude.json .mcp.json .cursor/mcp.json .vscode/mcp.json 2>/dev/null

For each hit, look at the version:

  • "args": ["mcp-remote", ...] with no version runs whatever npx resolves, which may be a copy cached long ago.
  • "args": ["mcp-remote@0.1.16", ...] or later pins a fixed version.

Then:

  1. Pin a fixed version in each config, for example mcp-remote@0.1.16 or newer, and update deliberately.
  2. Check each server URL is https:// and belongs to someone you trust.
  3. Remove servers you no longer use. An unused remote server is risk with no benefit.
  4. If you connected an affected version to a server you don’t trust, treat the machine as possibly compromised: rotate credentials it holds and look for unexpected processes or startup items.

Pin every MCP server, not just this one

The npx some-package pattern in MCP configs is convenient and it’s the root of the exposure here. Three habits apply to every server you run that way:

  • Pin exact versions (package@1.2.3), so an upgrade is a change you make and can review, not something npx does or doesn’t do behind your back.
  • Read the advisory feed for what you run. GitHub’s advisory database covers npm packages; npm audit in a project that lists your MCP servers as dependencies will flag known advisories.
  • Prefer servers that use stdio and touch only what they need. A server that opens browsers, spawns shells or listens on ports has more ways to go wrong than one that reads a file.

None of this would have stopped a first-day exploit. It does shorten the time you run a known-bad version from months to days.

The lesson for MCP clients

The MCP spec now has a section on exactly this class of bug. It says clients must allow only http:// and https:// schemes for authorization URLs (with http:// only for loopback during development), must reject javascript:, data:, file: and other dangerous schemes, must not use shell commands such as cmd.exe, sh or PowerShell to open URLs, and must sanitise URLs received from servers.3

The general rule: anything an MCP server sends is untrusted input, including metadata the protocol treats as plumbing. Tool descriptions, resource contents, error messages and OAuth URLs all come from the server. Our posts on token passthrough and the confused deputy and local server security cover the neighbouring risks, and MCP server security basics the wider picture.

What we don’t know

  • How many people ran affected versions against untrusted servers. We’ve seen no public count.
  • Whether it was used in an attack. The sources we cite describe research and a fix, not an incident.
  • Whether other stdio-to-HTTP proxies have similar bugs. The spec section above is a good checklist to hold them to.

To find configs that run unpinned MCP servers, or servers the scan doesn’t recognise, paste them into the check page or run npx deedglass scan (how the grade works); to try tool-call rules in your browser, open the playground.

Written with AI assistance and checked against our claims register.

The takeaway

mcp-remote 0.0.5 to 0.1.15 passed a server-supplied authorization URL into a command (CVSS 9.6); 0.1.16 fixed it. Check every config that runs it with npx.

Read nextFilesystem MCP server security: what allowed directories do, and how they were escaped Try it: install in 7 s

Related on this site

More posts

Sources

  1. 1GitHub advisory GHSA-6xpm-ggf7-wc3p (CVE-2025-6514) · github.com · checked 26 October 2026
  2. 2JFrog: Critical RCE vulnerability in mcp-remote, CVE-2025-6514 · jfrog.com · checked 26 October 2026
  3. 3MCP specification: Security best practices (OAuth authorization URL validation) · modelcontextprotocol.io · checked 26 October 2026
  4. 4npm: mcp-remote versions · npmjs.com · checked 26 October 2026

Published 26 October 2026, sources last checked 26 October 2026. If something here is out of date, write to hello@deedglass.com.

Try it on your own setup

npx deedglass scan

Grades only your own setup. Nothing is uploaded.

Pricing