Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/openhuman/mcp/config_servers/spawn_env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,14 @@ fn version_manager_dirs() -> Vec<PathBuf> {
push_if_dir(&mut dirs, home.join(".cargo").join("bin"));
dirs.extend(nvm_latest_bin_dir(&home));
}
#[cfg(windows)]
{
if let Some(local_app_data) = dirs::data_local_dir() {
push_if_dir(&mut dirs, local_app_data.join("Programs").join("uv").join("bin"));
push_if_dir(&mut dirs, local_app_data.join("Programs").join("uv"));
push_if_dir(&mut dirs, local_app_data.join("bin"));
}
}
for fixed in ["/opt/homebrew/bin", "/usr/local/bin", "/usr/local/sbin"] {
push_if_dir(&mut dirs, PathBuf::from(fixed));
}
Expand Down
24 changes: 24 additions & 0 deletions src/openhuman/mcp/config_servers/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -311,4 +311,28 @@ mod tests {
"expected Node.js guidance, got: {err}"
);
}

#[tokio::test]
async fn initialize_missing_uvx_mentions_uv_and_docs_link() {
let client = McpStdioClient::new(
"uvx".to_string(),
Vec::new(),
vec![("PATH".to_string(), "/openhuman/does-not-exist".to_string())],
None,
McpClientIdentityConfig::default(),
);
let err = client
.initialize()
.await
.expect_err("missing uvx must fail");
let msg = err.to_string();
assert!(
msg.contains("uv (Python)"),
"expected uv guidance, got: {msg}"
);
assert!(
msg.contains("https://docs.astral.sh/uv/"),
"expected uv docs link, got: {msg}"
);
}
}
Loading