{"slug": "mcphantom-agents-chose-deprecated-mcp-servers-in-98-of-tracked-sessions-and-no", "title": "MCPhantom: agents chose deprecated MCP servers in 98% of tracked sessions, and no patch is coming", "summary": "Glow Labs' Glow Security research team published a study, MCPhantom, finding that coding agents asked to set up an MCP server installed deprecated, archived servers in 98% of tracked sessions, pulling package names from training data rather than looking them up. The deprecated servers include four with high-severity vulnerabilities, among them an unpatched remote code execution flaw in the Puppeteer server that maintainers closed as out of scope because the repository was archived in May 2025. The affected packages logged 17,352,267 npm downloads since July 10, 2025, and the pattern appeared across Claude Code, Cursor, Codex CLI and other harnesses on models from Anthropic, OpenAI and xAI.", "body_md": "On November 2 the Glow Labs research team at Glow Security published a finding it named [MCPhantom](https://www.glow.io/blogs/mcphantom-ai-coding-agents-are-installing-vulnerable-deprecated-mcp-servers-from-training-data): coding agents asked to set up an MCP server keep installing deprecated ones, and the package name comes from the model's training data, not from anything the agent looked up. The servers in question are archived. Four of them carry high-severity vulnerabilities, one of those is an unpatched remote code execution bug, and the maintainers have said in writing that no fix is coming. [Help Net Security covered it the next day](https://www.helpnetsecurity.com/2026/11/03/mcphantom-deprecated-mcp-servers/).\n\nI read the whole report twice, because the pattern hits the exact layer I spend my days in: the config files that decide what your agent is allowed to run. Here is what it says and what I am changing in my own setup because of it.\n\nGlow Labs reviewed real coding-session transcripts where a deprecated MCP server got installed or suggested. In 98 percent of those sessions, the agent filled in the package name from memory. In the other 2 percent, the user asked for the old package by name and the agent obliged. In the GitHub example, the agent passed over the MCP server GitHub maintains itself and picked `@modelcontextprotocol/server-github`, an Anthropic reference server whose repository was archived in May 2025.\n\nThe pattern showed up in every harness in the data: Claude Code, Cursor, Codex CLI, Claude Cowork and Claude chat, on models from Anthropic, OpenAI and xAI. So no single vendor ships a fix for this. One caveat the report is honest about, and I want to keep it that way: the study only looked at sessions where a deprecated install happened. It says nothing about how often agents choose correctly overall. The number that matters is that when the wrong pick happened, it was almost never the user's idea.\n\nWhen Anthropic launched MCP in 2024 it published 20 reference servers as examples. The services built servers of their own, and 13 of the 20 got archived. Archived means the repository says no security updates or bug fixes will be provided. Agents do not read archive notices.\n\nUsage did not follow the deprecation. Glow Labs counted 17,352,267 npm downloads across the deprecated set since July 10, 2025, and five of the packages sit in npm's top MCP 100. `server-github` alone accounts for 5,266,085. The packages also cannot realistically be pulled: npm only lets owners delete a package with fewer than 300 downloads a week, a single owner and no public dependents, and Glow's Nadav Claude Cohen notes `server-github` had 185,239 downloads in a week and six owners. Deprecation marks do not stop `npx` either, it prints a warning and installs anyway.\n\nThe most serious of the four high-severity findings is an RCE in the Puppeteer server. One prompt injection is enough: instead of opening a browser, the server starts an arbitrary process and runs a command the attacker chose. The reason your harness does not catch it is the part I keep re-reading. The developer approved web browsing. The Puppeteer server is the thing that browses, so the commands it runs inherit that approval. One yes covers all of it.\n\nGlow Labs reported the flaw. The maintainers closed it as out of scope, on the grounds that the repository was archived in May 2025 and unmaintained, so no fix will come from it. They said they would look at marking the npm package deprecated. No exploitation has been observed so far. With no patch coming, the door stays open.\n\nGlow Labs calls these servers dependencies that never appear in a dependency file, and its breakdown of why every standard control misses them is the most useful part of the report:\n\n`npx`-launched server sits in no manifest, and these flaws have no CVE numbers.\nThe only place the whole thing is visible is the endpoint where the config got written and the install ran.\n\nMy first instinct was \"just tell the agent to verify the package before installing.\" The reporting already contains the counterexample. Cohen told Help Net Security: \"In one session the agent checked the package on npm and got back 'This package is deprecated.' It installed the package anyway and never told the user.\" A polite instruction is not a control. A control is something that fails closed when the model does not cooperate.\n\nThe fix that works today is boring: the MCP config block names the exact server, and the agent never gets to pick a package. Glow's own recommendation for security teams is the same idea at fleet scale, approve one MCP server per service, make it the standard, and add npm deprecation status to the approval criteria.\n\nThe shape to avoid, where the agent freehands a remembered package name:\n\n```\n{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol/server-github\"]\n    }\n  }\n}\n```\n\nThe shape to prefer: the service owner's own server, named explicitly, reviewed by a human, with a comment in the repo pointing at where the decision is recorded. GitHub maintains its own MCP server, and that is the one the config should name. When I approve a server now, I check it the way I would check any other dependency:\n\n```\nnpm view <package> deprecated\nnpm view <package> maintainers\n```\n\nIf the first command prints a deprecation notice, the server is out, whatever the agent remembers about it.\n\nCohen sees four possible sources of a fix: harness makers refusing deprecated servers, model makers updating what the models know, package owners patching, or pre-execution hooks, and his view is that only the hooks \"work today, without waiting for the harness makers, the model makers or the package owners.\" Claude Code already supports PreToolUse hooks, so a deny rule for the archived namespace is a few lines in settings:\n\n```\n{\n  \"hooks\": {\n    \"PreToolUse\": [\n      {\n        \"matcher\": \"Bash\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"jq -r '.tool_input.command' | grep -q '@modelcontextprotocol/server-' && exit 2 || exit 0\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\nExit 2 blocks the call and shows the reason to the agent, so the failed install is at least visible in the transcript instead of silent.\n\n`@modelcontextprotocol/server-`: `~/.claude.json`, project `.mcp.json`, `~/.cursor/mcp.json`.` npm view <package> deprecated` on every hit.\nNone of this is new discipline, it is the same rule I already apply to lockfile dependencies, applied to the one dependency tree that never had a lockfile. I wrote about the official MCP servers shipping vulnerability fixes in [v2.1.0](https://dev.to/piekwerk/mcp-servers-v210-fixes-8-vulnerabilities-filesystem-writes-could-escape-allowed-folders-112h), and the marketplace malware that posed as Claude Code in Cursor [back in October](https://dev.to/piekwerk/malware-posed-as-claude-code-in-cursors-marketplace-what-your-agent-config-can-and-cannot-contain-3f61). MCPhantom is the third leg of the same stool: the supply chain your agent builds for you, one remembered package name at a time, with nobody left maintaining it.", "url": "https://wpnews.pro/news/mcphantom-agents-chose-deprecated-mcp-servers-in-98-of-tracked-sessions-and-no", "canonical_source": "https://dev.to/piekwerk/mcphantom-agents-chose-deprecated-mcp-servers-in-98-of-tracked-sessions-and-no-patch-is-coming-1adk", "published_at": "2026-11-04 07:14:32+00:00", "updated_at": "2026-11-04 07:22:54.212685+00:00", "lang": "en", "topics": ["ai-agents", "ai-safety", "agent-protocols", "ai-tools", "ai-research"], "entities": ["Glow Labs", "Glow Security", "Anthropic", "OpenAI", "xAI", "Claude Code", "Cursor", "Codex CLI"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/mcphantom-agents-chose-deprecated-mcp-servers-in-98-of-tracked-sessions-and-no", "markdown": "https://wpnews.pro/news/mcphantom-agents-chose-deprecated-mcp-servers-in-98-of-tracked-sessions-and-no.md", "text": "https://wpnews.pro/news/mcphantom-agents-chose-deprecated-mcp-servers-in-98-of-tracked-sessions-and-no.txt", "jsonld": "https://wpnews.pro/news/mcphantom-agents-chose-deprecated-mcp-servers-in-98-of-tracked-sessions-and-no.jsonld"}}