#!/usr/bin/env bash
# Setup npm to install global packages without sudo
# Works on macOS and Linux
# This script is idempotent - safe to run multiple times
set -euo pipefail
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Helper functions
info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Detect shell configuration file
detect_shell_config() {
if [[ -n "${BASH_VERSION:-}" ]]; then
if [[ -f "$HOME/.bash_profile" ]]; then
echo "$HOME/.bash_profile"
else
echo "$HOME/.bashrc"
fi
elif [[ -n "${ZSH_VERSION:-}" ]]; then
echo "$HOME/.zshrc"
else
# Default to bashrc if we can't detect
echo "$HOME/.bashrc"
fi
}
main() {
info "Setting up npm to install global packages without sudo..."
# Check if npm is installed
if ! command -v npm &> /dev/null; then
error "npm is not installed. Please install Node.js and npm first."
exit 1
fi
NPM_GLOBAL_DIR="$HOME/.npm-global"
SHELL_CONFIG=$(detect_shell_config)
# Check current npm prefix
CURRENT_PREFIX=$(npm config get prefix 2>/dev/null || echo "")
# Check if already configured
if [[ "$CURRENT_PREFIX" == "$NPM_GLOBAL_DIR" ]]; then
success "npm is already configured to use $NPM_GLOBAL_DIR"
else
# Create npm global directory
if [[ ! -d "$NPM_GLOBAL_DIR" ]]; then
info "Creating $NPM_GLOBAL_DIR directory..."
mkdir -p "$NPM_GLOBAL_DIR"
fi
# Configure npm prefix
info "Configuring npm to use $NPM_GLOBAL_DIR..."
npm config set prefix "$NPM_GLOBAL_DIR"
success "npm prefix set to $NPM_GLOBAL_DIR"
fi
# Check if PATH already contains npm-global/bin
if [[ ":$PATH:" == *":$NPM_GLOBAL_DIR/bin:"* ]]; then
success "PATH already includes $NPM_GLOBAL_DIR/bin"
else
# Add to PATH in shell config
info "Adding $NPM_GLOBAL_DIR/bin to PATH in $SHELL_CONFIG..."
# Check if the export line already exists in shell config
if grep -q "export PATH=\"\$HOME/.npm-global/bin:\$PATH\"" "$SHELL_CONFIG" 2>/dev/null; then
warning "PATH export already exists in $SHELL_CONFIG"
else
# Add export to shell config
echo '' >> "$SHELL_CONFIG"
echo '# npm global packages path (added by setup-npm-global.sh)' >> "$SHELL_CONFIG"
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> "$SHELL_CONFIG"
success "Added PATH export to $SHELL_CONFIG"
warning "You need to reload your shell configuration:"
echo " Run: source $SHELL_CONFIG"
echo " Or start a new terminal session"
fi
fi
echo ""
success "npm global setup complete!"
echo ""
info "You can now install global packages without sudo:"
echo " npm install -g <package-name>"
echo ""
# Show current configuration
info "Current configuration:"
echo " npm prefix: $(npm config get prefix)"
echo " Shell config: $SHELL_CONFIG"
# Check if we need to reload
if [[ ":$PATH:" != *":$NPM_GLOBAL_DIR/bin:"* ]]; then
echo ""
warning "Don't forget to reload your shell configuration!"
echo " Run: source $SHELL_CONFIG"
fi
}
# Run main function
main "$@"
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mbailey/voicemode'
If you have feedback or need assistance with the MCP directory API, please join our Discord server