Discover MCPs & agents
Loading MCPs and agents…
Loading MCPs and agents…
Deploy Claude Code and additional tools to a VM for remote development
From the repo.
Automated deployment system for Claude Code development environments on Debian VMs.
Core Components:
Configuration Management:
Security & Safety:
Automation:
# Clone and setup
git clone https://github.com/ksamaschke/claude-code-vm.git
cd claude-code-vm
make setup
# Configure your environment (optional but recommended)
nano .env # Add Git credentials and MCP API keys
# Choose your deployment tier
make deploy-baseline VM_HOST=192.168.1.100 TARGET_USER=developer # Minimal
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=developer # + MCPs + Docker
make deploy-containerized VM_HOST=192.168.1.100 TARGET_USER=developer # + Docker Compose + shell
make deploy-full VM_HOST=192.168.1.100 TARGET_USER=developer # + Kubernetes + everything
# Or deploy specific components
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=developer # CLAUDE.md and settings.json
deploy-baseline)Minimal core development environment
deploy-enhanced)Baseline + AI capabilities + containerization
deploy-containerized)Enhanced + orchestration + productivity
dps, dcp, dcup, dcdown, dexec, dlogs aliasesdeploy-full)Everything + Kubernetes + comprehensive tooling
k, kgp, kgs, kdesc, etc.)kctx, kns, drun, cdls, ffconfig/The project uses the config/ directory for default configuration files:
config/
├── env.example # Template for .env file with Git credentials and API keys
├── git-repos.env.example # Template for Git repository configuration
├── mcp-servers.template.json # Template for MCP server configuration
├── CLAUDE.common.md # Common base configuration (shared by all)
├── CLAUDE.minimal.md # Minimal deployment configuration
├── CLAUDE.enhanced.md # Enhanced deployment with MCP/Docker
├── CLAUDE.containerized.md # Containerized with Docker Compose
└── CLAUDE.full.md # Full deployment with Kubernetes
Environment File (.env)
config/.env (create from config/env.example)ENV_FILE=/path/to/your/.envMCP Configuration (mcp-servers.json)
config/mcp-servers.jsonMCP_FILE=/path/to/your/mcp-servers.jsonconfig/mcp-servers.template.json as defaultGit Repository Configuration
GIT_CONFIG_FILE=/path/to/your/git-repos.conf# 1. Clone the repository
git clone https://github.com/ksamaschke/claude-code-vm.git
cd claude-code-vm
# 2. Run setup to create default configuration
make setup # Creates config/.env from template
# 3. Edit configuration files
nano config/.env # Add your Git PATs and API keys
# 4. Deploy
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=developer
# Use k3s (default - production-ready, lightweight)
make deploy-full VM_HOST=192.168.1.100 TARGET_USER=dev KUBERNETES_BACKEND=k3s
# Use KIND (development-focused, runs in Docker)
make deploy-full VM_HOST=192.168.1.100 TARGET_USER=dev KUBERNETES_BACKEND=kind
# Deploy only Git repositories (after initial deployment)
make deploy-git-repos VM_HOST=192.168.1.100 TARGET_USER=dev
# Enable automatic repository cloning during deployment
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev MANAGE_GIT_REPOSITORIES=true
# Use separate Git configuration file
make deploy-git-repos VM_HOST=192.168.1.100 TARGET_USER=dev GIT_CONFIG_FILE=.git-repos.env
# Supports multiple Git URL formats in config files:
# GITHUB_URL=https://github.com/user/repo.git (simple format)
# GIT_REPO_URL=https://github.com/user/repo.git (single repo)
# GIT_REPO_1_URL=... (multiple repos)
# Use external environment file
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev ENV_FILE=/path/to/production.env
# Use external MCP configuration
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev MCP_FILE=/path/to/custom-mcp.json
# Use external Claude settings
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=dev CLAUDE_SETTINGS_FILE=/path/to/custom-settings.json
# Use all external configs
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev \
ENV_FILE=/external/configs/production.env \
MCP_FILE=/external/configs/my-mcp-servers.json \
CLAUDE_SETTINGS_FILE=/external/configs/restrictive-settings.json
# Setup and validation
make help # Show comprehensive help with all deployment options
make setup # Initialize environment files (.env, mcp-servers.json)
make check-config # Validate configuration before deployment
make test-connection # Test SSH connectivity to target VM
make validate # Verify all deployed components are working
make clean # Clean up temporary files and logs
# 4-tier deployments
make deploy-baseline # Tier 1: Git + Node.js + Claude Code + uvx
make deploy-enhanced # Tier 2: Baseline + MCPs + Docker
make deploy-containerized # Tier 3: Enhanced + Docker Compose + bashrc
make deploy-full # Tier 4: Everything + Kubernetes + comprehensive tooling
# Component-specific deployments
make deploy-claude-config # Deploy CLAUDE.md and settings.json (supports localhost)
make deploy-mcp # Deploy/update MCP servers on target VM
make deploy-git-repos # Clone and manage Git repositories on target VM
make list-remote SSH_HOST=<ip> SSH_USER=<user> # List MCP servers on remote VM
The system automatically deploys both CLAUDE.md and settings.json files to ~/.claude/ on target VMs:
CLAUDE.md Features:
claude_config_template parametersettings.json Features:
CLAUDE_SETTINGS_TEMPLATE) or external files (CLAUDE_SETTINGS_FILE)Usage:
# Auto-detection (default) - deploys both CLAUDE.md and settings.json
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev
# Deploy CLAUDE.md and settings.json only
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=dev
# Use custom templates or external files
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=dev \
CLAUDE_CONFIG_TEMPLATE=config/CLAUDE.custom.md \
CLAUDE_SETTINGS_TEMPLATE=config/custom-settings.json
# Use external configuration files
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=dev \
CLAUDE_SETTINGS_FILE=/path/to/external-settings.json
# Force override existing files
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=dev \
CLAUDE_CONFIG_FORCE_OVERRIDE=true \
CLAUDE_SETTINGS_FORCE_OVERRIDE=true
# Deploy to localhost (no SSH required)
make deploy-claude-config VM_HOST=localhost TARGET_USER=$USER
See docs/claude-config.md for detailed documentation.
config/mcp-servers.template.json:
GIT_{NAME}_{FIELD} for unlimited Git server supportdps, dpa, di, drm, dexec, dlogs, dcp, dcup, dcdown, dcps, dclogsk, kgp, kgs, kgd, kdesc, klogs, kexec, kapply, kdeletedrun <image> - Quick container executionkctx [context] - Kubernetes context switchingkns [namespace] - Namespace switchingcdls <dir> - Change directory and listff <pattern> - Fast file find# Containerized development environment with Git automation
make deploy-containerized VM_HOST=192.168.1.100 TARGET_USER=developer \
MANAGE_GIT_REPOSITORIES=true GIT_CONFIG_FILE=team-repos.env
# Full environment with uvx for Python tools and Kubernetes for ML workloads
make deploy-full VM_HOST=192.168.1.100 TARGET_USER=datascientist \
KUBERNETES_BACKEND=k3s
# KIND for local Kubernetes development with Docker Compose fallback
make deploy-full VM_HOST=192.168.1.100 TARGET_USER=developer \
KUBERNETES_BACKEND=kind
# Baseline environment for lightweight build agents
make deploy-baseline VM_HOST=192.168.1.100 TARGET_USER=ci-agent
# Use configuration files from another location
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev \
ENV_FILE=/path/to/external/.env \
MCP_FILE=/path/to/external/mcp-servers.json \
GIT_CONFIG_FILE=/path/to/external/git-repos.conf
# Example: Using configurations from another project
make deploy-full VM_HOST=192.168.1.100 TARGET_USER=dev \
ENV_FILE=~/my-configs/.env \
MCP_FILE=~/my-configs/mcp-servers.json
# SSH key authentication
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev \
TARGET_SSH_KEY=~/.ssh/custom_key
# Password authentication
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev \
USE_SSH_PASSWORD=true SSH_PASSWORD=secure_password
# Sudo password required
make deploy-enhanced VM_HOST=192.168.1.100 TARGET_USER=dev \
USE_BECOME_PASSWORD=true BECOME_PASSWORD=sudo_password
# Deploy specific components using Ansible directly
ansible-playbook ansible/playbooks/site.yml --tags git,git-repos
ansible-playbook ansible/playbooks/site.yml --tags docker -e install_docker=true
ansible-playbook ansible/playbooks/site.yml --tags kubernetes -e install_kubectl=true
ansible-playbook ansible/playbooks/site.yml --tags bashrc -e enable_bashrc_integrations=true
ansible-playbook ansible/playbooks/site.yml --tags uvx
# Test basic connectivity
make test-connection VM_HOST=192.168.1.100 TARGET_USER=dev
# Check configuration
make check-config
# Manual verification
ssh dev@192.168.1.100 'docker --version && kubectl version --client && node --version'
# Verbose deployment for debugging
ansible-playbook ansible/playbooks/site.yml -vvv
# Check specific component
ansible-playbook ansible/playbooks/site.yml --tags docker --check --diff
# Validate after deployment
make validate VM_HOST=192.168.1.100 TARGET_USER=dev
# On target VM, update shell environment
source ~/.bashrc
# Verify installations
docker --version
kubectl version --client
claude --version
uvx --version
# Deploy CLAUDE.md with auto-detected template
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=dev
# Deploy specific CLAUDE template
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=dev \
CLAUDE_CONFIG_TEMPLATE=config/CLAUDE.full.md
# Force override existing CLAUDE.md
make deploy-claude-config VM_HOST=192.168.1.100 TARGET_USER=dev \
CLAUDE_CONFIG_FORCE_OVERRIDE=true
# Deploy to localhost (no SSH or Debian required)
make deploy-claude-config VM_HOST=localhost TARGET_USER=$USER
The system automatically detects localhost deployments and adjusts accordingly:
VM_HOST=localhost or VM_HOST=127.0.0.1Note: Full stack deployments to localhost may have limitations on non-Debian systems.
MIT License - see LICENSE file for details.
Ready to deploy? Start with make setup and choose your tier! 🚀
Need help? Check the documentation or open an issue for support.
Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.