11ed840431
`npx` resolves a package and then FORKS: it stays alive as the real MCP server's parent for the whole process lifetime while doing no work. Measured on a 4-agent host, that is ~48 MB of private memory per stdio MCP server — and it buys nothing here, because Hermes already wraps the child in its own parent-death watchdog, so npx's supervision is a second parent nobody reads. The process tree for one server is watchdog -> `npm exec <pkg>` -> node. When the package is already in npx's cache, spawn its binary directly and drop the middle process. A cache miss changes nothing: the command stays `npx`, so a cold machine still installs on first run. The swap deliberately happens AFTER the OSV malware preflight. `_infer_ecosystem` keys off the command basename being `npx`/`uvx`/`pipx`, so rewriting first makes `check_package_for_malware` return None and silently turns the gate into a no-op. Two tests pin that ordering — one behavioural, one structural — because a future edit that moved the swap earlier would disable the malware check without failing any test of either piece alone. This is also why doing it in code beats the config workaround of pointing `command` straight at the cached path: that loses the preflight. Conservative by construction — falls back to npx for a version-pinned spec (npx owns that resolution), an ambiguous or absent `bin` map, a missing or non-executable binary, an unreadable cache entry, or no cache at all. Measured on a Mac mini running four agent gateways plus a dashboard, ten stdio MCP servers total: resident `npm exec` parents 5 -> 0, tracked footprint 1531 MB -> 1324 MB across 30 -> 25 processes, free memory 464 MB -> 697 MB on a host that was actively swapping. Every MCP server kept working; tool calls verified against a live Linear server afterwards.