tinyhumansai/openhuman · error · anyhow::Error

`{command}` was not found. This MCP server needs uv (Python)

Error message

`{command}` was not found. This MCP server needs uv (Python), which doesn't appear to be installed. Install it from https://docs.astral.sh/uv/ and restart OpenHuman.

What it means

Same pre-spawn guard as the Node variant, but for `uv`/`uvx` (basename match, case-insensitive): `locate_command` cannot find the uv executable on the resolved PATH, so the Python-based stdio MCP server is never launched. The message points at uv specifically because the command basename identifies the Astral uv runtime.

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

  1. Install uv from https://docs.astral.sh/uv/ and restart OpenHuman.
  2. If uv is installed, ensure its location (commonly `~/.local/bin`, `~/.cargo/bin`) is on the PATH OpenHuman resolves — set an explicit `env` PATH on the server entry or move/symlink uv into a system PATH dir.
  3. Use an absolute `command` path to the uv/uvx binary.
  4. Verify with `which uvx` from the same context that launches OpenHuman.

Example fix

# before
[[mcp_client.servers.python-server]]
command = "uvx"
args = ["some-mcp-server"]

# after — absolute path avoids PATH resolution surprises
[[mcp_client.servers.python-server]]
command = "/Users/me/.local/bin/uvx"
args = ["some-mcp-server"]
Defensive patterns

Strategy: validation

Validate before calling

let path = std::env::var("PATH").unwrap_or_default();
if spawn_env::locate_command("uvx", &path, None).is_none() {
    // prompt the user to install uv before configuring uv-based servers
}

Prevention

When it happens

Trigger: A stdio MCP server entry with `command = "uvx"` (or `uv`) on a machine without uv installed, or uv installed via `pip`/`pipx`/`cargo` into a user bin dir that is on the shell PATH but not on OpenHuman's resolved spawn PATH.

Common situations: uv installed with `curl ... | sh` which edits shell rc files only, so a GUI-launched OpenHuman misses it; CI/docker images without uv; server config authored on a developer box and synced to a host lacking uv.

Related errors


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/3fefc4ae5330f6ad. Report an issue: GitHub.