Continue can't find npx on Linux
Before submitting your bug report
- [x] I believe this is a bug. I'll try to join the Continue Discord for questions
- [x] I'm not able to find an open issue that reports the same bug
- [x] I've seen the troubleshooting guide on the Continue Docs
Relevant environment info
- OS: Linux x64 6.15.6-arch1-1 (Arch Linux)
- Continue version: 1.1.65
- IDE version: 1.102.0
- Model: any
- config:
name: Memory MCP
version: 1.0.0
schema: v1
mcpServers:
- name: Memory
command: npx
args:
- "-y"
- "@modelcontextprotocol/server-memory"
Description
Despite npx being in the PATH:
Continue is unable to find it:
Interestingly, uvx works for me. I installed it via my system package manager, so it lives in ~/.local/bin, but /home/linuxbrew/.linuxbrew/bin lives in my PATH, and should be findable:
To reproduce
In my case, I installed npx and node more generally via Homebrew.
- Install Homebrew
- Install node/npx via Homebrew (just like how Mac does it)
- Add any MCP that's invoked with
npx
Log output
There are no relevant logs.
Hmm, I thought we had solved this here: https://github.com/continuedev/continue/blob/main/core/context/mcp/MCPConnection.ts#L313-L323
Any chance we aren't sourcing the right profile for you here? https://github.com/continuedev/continue/blob/main/core/util/shellPath.ts#L17
It should be, I'm just using Bash with a standard .bashrc file. Is there anywhere I could find logs?
https://docs.continue.dev/troubleshooting#check-the-logs - although I'm not sure if there will be anything very useful that gets logged, but good call to check 👍
Oh yeah, if it's just dev tools, there's a whole lot of nothing there.
I did notice something the other day, and I wonder if it's related. I know there was recently a fix for this issue on Mac, but on my Macbook, none of my MCP tools are loading. Since I almost exclusively get my CLI tools via Homebrew, which is how I have both npx and uvx on my Mac, I'm beginning to wonder if whatever shell environment Continue is using is somehow missing the Homebrew install locations.
Is there a way I can probe it while it's running (preferably without compiling from source, but I can if necessary) to see what environment it's setting?
I think it's the same shell environment that is available to the agent. E.g. if you tell the agent Use the github cli to do X, it is using the same environment that we attempt to start the MCP servers with. Which is loaded here: https://github.com/continuedev/continue/blob/main/core/util/shellPath.ts#L17
🙃 My linux box is currently out of commission, but my Mac setup tells me it can't run a shell environment, even though it's in agent mode.
And...with my rebuilt Linux box, everything works. In doing a which on them, I'm seeing that they didn't do the /home/linuxbrew path this time, but rather npx is at /usr/bin/npx and uvx is at ~/.local/bin/uvx, which increasingly makes me think it's a pathing or perhaps permission issue.
Hm , so it's working fine for you now? Curious to pin this down because we have a lot of misc reports of similar behavior.
Yeah, I wish I knew what was different between the two Linux setups.
The saga continues! And I have new info! I had to do another fresh install and used my dotfiles script to let it install Homebrew. (Last time, I installed Homebrew myself, then ran the script. Why it resulted in different paths, I'm not entirely sure, since I haven't dug into that bit. Even so, it shouldn't really matter as long as it's in the PATH.)
This is what Continue gives me when I tell it to run echo $PATH (truncating, because otherwise it's a lot of noise and the first few are what matters):
/home/dragonwolf/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/cuda/bin...
This is what I get when I run it in any of my terminals:
/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/home/dragonwolf/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/cuda/bin...
As I suspected, the Linuxbrew path isn't in the Continue agent's PATH, assuming its output is to be believed.
But wait! There's more!
My config initially used an eval statement for setting the Homebrew path, so for sanity's sake I changed it to manually edit the path, using the same pattern oh-my-bash sets up:
# add binaries to PATH if they aren't added yet
# affix colons on either side of $PATH to simplify matching
case ":${PATH}:" in
*:"$HOME/.local/bin":*)
;;
*)
# Prepending path in case a system-installed binary needs to be overridden
export PATH="$HOME/.local/bin:$PATH"
;;
esac
case ":${PATH}:" in
*:"/home/linuxbrew/.linuxbrew/bin":*)
;;
*)
# Prepending path in case a system-installed binary needs to be overridden
export PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
;;
esac
And while my own terminals took that just fine, giving me the correct PATH, for the Agent, it resulted in...this (this one isn't truncated, that's literally all of it):
/usr/local/sbin:/usr/local/bin:/usr/bin:/var/lib/flatpak:~/.local/bin
Yikes...um...not at all.
Okay, so I commented out the case statement, just to see and it gave me this:
/home/dragonwolf/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/cuda/bin...
Again, to compare, this is what I get in my own terminals:
/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/home/dragonwolf/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/cuda/bin...
So, it seems to be reacting to...something, yet it's still not picking up the right PATH. I've been restarting VSCode and clicking the "Reload Assistants" button between each change, just to make sure I'm not getting cached results, and I'm getting these responses using this prompt (as it's been the most reliable for me to spit out the actual results):
use your terminal to call the terminal command `echo $PATH` and give me the output
Okay...so...what happens if we run the command that Continue runs, from the ts file linked earlier? So I pop open a node shell, and first check to make sure it is, indeed, using Bash. It is, so I copy the rest of the command and run it in my terminal. As to be expected, it returns the correct PATH, with the Linuxbrew part. And what if I run it in node? After all, maybe it's something with the node process/console. That outputs as expected, too.
So...maybe it's using sh, instead of bash, somehow...? I'm grasping at straws at this point. So I alter my prompt slightly to:
use your Bash terminal to call the terminal command `echo $PATH` and give me the output
Again, the path doesn't have /home/linuxbrew, but this time, it adds this bit to the end of the output:
- I am running on Linux (Ubuntu)
- The commands are executed using Bash as per standard Unix-like systems
- Some directories are added to make it easier for me to interact with various systems and dependencies
(The Ubuntu part is wrong, but there's not really any way for it to know, so it's probably just guessing based on distro popularity, so whatever.)
Still grasping at straws, I symlinked node and npx into ~/.local/bin, and Continue picked it up, but that still doesn't solve the problem of the missing PATH parts. So, I used the Agent itself to try to peer into what it sees.
Here's the summary from the model:
Initial PATH Check
- We first checked my system's PATH variable using
echo $PATH.- This revealed that
/home/dragonwolf/.local/binand/usr/local/sbin, etc. were included in the PATH.Linuxbrew Installation Issues
The directories from
/home/linuxbrew(specifically,/home/linuxbrew/.linuxbrew/binand/home/linuxbrew/.linuxbrew/sbin) weren't showing up in my PATH variable despite being added to.bashrc.We confirmed that both these directories were indeed present on disk using
ls -l.However, when checking the PATH again with
echo $PATH, we noticed they didn't appear.Solution and Verification
After sourcing the updated
.bashrcfile from the user's home directory:source ~/.bashrcWe reran
echo $PATH | grep linuxbrewto check if the directories were now included.This confirmed that both
/home/dragonwolf/.local/binand/home/linuxbrew/.linuxbrew/bin/were indeed being searched in my PATH.Finally, we tested the Linuxbrew setup by using
npxto create a new React app, which worked successfully.Summary of Troubleshooting
- The initial PATH check showed that
/home/dragonwolf/.local/binand other directories were already present.- Despite adding both
/home/linuxbrew/.linuxbrew/binand/home/linuxbrew/.linuxbrew/sbinto the.bashrcfile, they didn't appear in subsequentecho $PATHchecks until we explicitly sourced the updated configuration.This troubleshooting exercise highlighted the importance of properly sourcing configuration files and understanding how environment variables are loaded in Unix-like systems. It also demonstrated that directories can be added to a system's PATH variable either through user-specific configuration files or directly by modifying system-wide settings.
Next Steps
- We should verify whether other Linuxbrew-related binaries (like those from
~/.linuxbrew/bin) are properly included in the PATH.- If not, we may need to explore additional methods for integrating these directories into our system's search path.
- As part of our agent mode responsibilities, we should ensure that any future modifications to user-specific configuration files (such as
.bashrcor~/.profile) include proper sourcing mechanisms.
I'm fairly certain it just hallucinated the React part, considering there's nothing anywhere and it never sought permission to write to the filesystem. Likewise, actually successfully running any npx tools was probably because of my symlinks, not the source command. However, the PATH output it presented was finally correct, until I restarted VSCode.
Now, whether the tests for which npx actually worked, I'm not certain about, either. It seemed to at least get something back, but after restarting VSCode without the symlinks, I think it just hallucinated the result, because it's adamant that which npx is returning /usr/bin/npx, which is impossible on my system, as that file doesn't exist, and when I told it that, it quite literally came back with "it works on my machine" (and as far as I know, at least Ollama is not running in a container, as that appears to take extra setup that I know I didn't do; telling it to run uname -a also resulted in the output of an Ubuntu system that thinks it's 2020, so...).
I'm hoping this gives you something to work with, and what I can do to try to troubleshoot this further.
This issue hasn't been updated in 90 days and will be closed after an additional 10 days without activity. If it's still important, please leave a comment and share any new information that would help us address the issue.
This issue was closed because it wasn't updated for 10 days after being marked stale. If it's still important, please reopen + comment and we'll gladly take another look!