tinyhumansai/openhuman · error · anyhow::Error
`{command}` was not found. This MCP server needs Node.js, wh
Error message
`{command}` was not found. This MCP server needs Node.js, which doesn't appear to be installed (or isn't on OpenHuman's PATH). Install Node.js from https://nodejs.org and restart OpenHuman. What it means
Raised by the stdio MCP transport before spawning: `spawn_env::locate_command` could not find `npx`, `npm`, or `node` on the resolved PATH (config `env` PATH override, else the OpenHuman spawn PATH), so the server process is never started. `missing_command_error` recognizes Node-family commands by basename (after the last `/` or `\\`, case-insensitive) and emits this Node.js-specific guidance. A `tracing::warn` with target `[mcp_client::stdio]` is emitted alongside.
Source
Thrown at src/openhuman/mcp/config_servers/stdio.rs:101
command.env(key, value);
}
// Resolve the command up front so a missing Node/uv runtime fails with
// actionable guidance instead of a bare ENOENT from `spawn`.
let effective_path = self
.env
.iter()
.rev()
.find(|(key, _)| key == "PATH")
.map(|(_, value)| value.as_str())
.unwrap_or(resolved_path.as_str());
if spawn_env::locate_command(&self.command, effective_path, self.cwd.as_deref()).is_none() {
tracing::warn!(
target: "[mcp_client::stdio]",
command = %self.command,
"stdio MCP command not found on resolved PATH"
);
anyhow::bail!(spawn_env::missing_command_error(&self.command));
}
let mut child = command
.spawn()
.with_context(|| format!("spawning MCP stdio server `{}`", self.command))?;
let stdin = child
.stdin
.take()
.ok_or_else(|| anyhow::anyhow!("stdio server missing stdin"))?;
let stdout = child
.stdout
.take()
.ok_or_else(|| anyhow::anyhow!("stdio server missing stdout"))?;
let mut session = StdioSession {
child,
stdin,
stdout: BufReader::new(stdout),
initialize: McpInitializeResult {View on GitHub (pinned to 7491200858)
Solutions
- Install Node.js from https://nodejs.org and fully restart OpenHuman (not just reload the window).
- If Node is already installed, add its bin dir to the PATH OpenHuman sees — prefer the system PATH over shell-rc-only setup, or set an explicit `env = { PATH = "..." }` on the server entry (the last PATH entry in `env` wins).
- Use an absolute `command` path to the npx/node binary to bypass PATH resolution entirely.
- Verify with `which npx` in the same environment OpenHuman launches from.
Example fix
# before (config.toml) — relies on inherited PATH [[mcp_client.servers.context7]] command = "npx" args = ["-y", "@upstash/context7-mcp"] # after — pin the absolute binary, or inject PATH explicitly [[mcp_client.servers.context7]] command = "/opt/homebrew/bin/npx" args = ["-y", "@upstash/context7-mcp"] # alternatively: # [[mcp_client.servers.context7.env]] # key = "PATH" # value ="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
Defensive patterns
Strategy: validation
Validate before calling
// before enabling a Node-based stdio server, verify the runtime is visible:
let path = std::env::var("PATH").unwrap_or_default();
if spawn_env::locate_command("npx", &path, None).is_none() {
// surface a setup hint instead of letting the first call fail
} Prevention
- Install Node.js system-wide rather than via shell-rc-only managers when running GUI apps.
- Pin `command` to an absolute binary path in config to bypass PATH resolution.
- Restart OpenHuman fully after installing runtimes — PATH is snapshotted at launch.
When it happens
Trigger: A `[[mcp_client.servers]]` stdio entry with `command = "npx"` (or `node`/`npm`, or an absolute path whose basename is one of these) on a machine without Node.js installed, or where Node is installed via a shell-only PATH injection (nvm, volta shim, homebrew shellenv) that OpenHuman's process does not inherit.
Common situations: GUI-launched OpenHuman not inheriting the login shell PATH (macOS .zshrc-only nvm setup); Node installed for the user but OpenHuman running as a service/other user; Windows Node installed but not on system PATH; fresh machine where the MCP server was configured before installing its runtime.
Related errors
- `{command}` was not found. This MCP server needs uv (Python)
- `{command}` was not found on OpenHuman's PATH. Install it (o
- stdio MCP server closed stdout while waiting for `{method}`
- MCP stdio error: {err}
- memory file not found: ${path}
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/64f1b89b9b3c7961.
Report an issue: GitHub.