UNPKG

@light-merlin-dark/vssh

Version:

MCP-native SSH proxy for AI agents. CLI & MCP Server, plugin system, AI safety guards.

510 lines (403 loc) 16 kB
``` ██╗ ██╗███████╗███████╗██╗ ██╗ ██║ ██║██╔════╝██╔════╝██║ ██║ ██║ ██║███████╗███████╗███████║ ╚██╗ ██╔╝╚════██║╚════██║██╔══██║ ╚████╔╝ ███████║███████║██║ ██║ ╚═══╝ ╚══════╝╚══════╝╚═╝ ╚═╝ MCP-native SSH proxy for AI agents CLI & MCP Server • Plugin system • AI safety guards ``` ## Why? - Execute server commands without SSH syntax complexity - Plugin system extends functionality (File Transfer, Docker, Coolify, Grafana, File Editor) - Native file transfers with automatic directory compression (upload/download) - Safety guards prevent destructive operations (rm -rf /, dd, docker prune -af) - No quote escaping issues in AI permission systems - Audit trails logged to `~/.vssh/data/logs/` - MCP-native with tools exposed automatically ## Model Context Protocol (MCP) Setup ### Quick Start with Claude Code ```bash # Install vssh globally npm install -g @light-merlin-dark/vssh # Install to Claude Code vssh install ``` ### Available MCP Tools Once configured, AI agents gain access to: - `run_command` - Execute any SSH command with safety checks - `get_local_mode` - Check if commands execute locally or remotely - `set_local_mode` - Toggle between local and remote execution - `upload_file` - Upload files/directories with auto-zip (File Transfer plugin) - `download_file` - Download files/directories with auto-zip (File Transfer plugin) - `list_docker_containers` - List all containers (Docker plugin) - `show_docker_logs` - View container logs (Docker plugin) - `show_docker_info` - System information dashboard (Docker plugin) - `get_coolify_proxy_config` - Coolify configuration (Coolify plugin) - `list_grafana_dashboards` - List all Grafana dashboards (Grafana plugin) - `view_grafana_dashboard` - View dashboard details (Grafana plugin) - `edit_file` - Advanced file editing operations (File Editor plugin) - And many more plugin-based tools! ## Key Features ### Unified Command Execution All commands now execute through a centralized proxy system: - Consistent logging and timing for all operations - Plugin commands automatically use proxy pipeline - Toggle between local and remote execution modes - Perfect for development, testing, and production use ### AI-Optimized Interface ```bash # AI agents can use natural commands without complex quoting vssh docker ps vssh docker logs my-app --tail 50 vssh 'ps aux | grep node' # Single quotes for pipes # AI-friendly quoted syntax vssh "docker ps -a" # Entire command in quotes vssh "ls -la /var/log" # Perfect for AI permission patterns # No more struggling with SSH syntax # ❌ ssh user@host "docker exec -it container bash -c 'cat /etc/config'" # ✅ vssh docker exec container cat /etc/config ``` ### Built-in Safety Guard Protects against accidentally destructive commands: ```bash vssh rm -rf / # ❌ Blocked! vssh dd if=/dev/zero of=/dev/sda # ❌ Blocked! vssh docker system prune -af --volumes # ❌ Blocked! ``` ### Complete Audit Trail Every command and output is logged to `~/.vssh/data/logs/` for accountability and debugging. ## Installation ```bash # Install globally via npm npm install -g @light-merlin-dark/vssh # Run interactive setup vssh --setup ``` ### Prerequisites - Node.js 14.0.0 or higher - SSH key-based authentication - Target server with SSH access ## Quick Start ### First-Time Setup ```bash vssh --setup ``` This interactive setup will: 1. Detect available SSH keys on your system 2. Ask you to select or specify an SSH key 3. Configure your target server (hostname/IP) 4. Save configuration to `~/.vssh/config.json` 5. Enable default plugins (File Transfer, Docker, and Coolify) 6. Generate encryption key for secure credential storage ### Basic Usage #### Core Commands ```bash # View comprehensive categorized help vssh --help # Shows all available commands by category # Run simple commands vssh ls -la vssh free -m # AI-friendly quoted syntax vssh "ls -la /var/log" # Perfect for AI agents # Complex commands with pipes (use single quotes) vssh 'ps aux | grep node' ``` #### Plugin Commands ```bash # File transfer plugin commands (enabled by default) vssh upload ./config.yml /etc/app/config.yml # Upload single file vssh push ./my-folder /var/www/ # Upload directory (auto-zips) vssh download /etc/app/config.yml ./config.yml # Download single file vssh pull /var/www/myapp ./ # Download directory (auto-zips) # Docker plugin commands (short aliases) vssh ldc # List docker containers vssh gdc myapp # Get docker container vssh sdl web --tail 100 # Show docker logs vssh ldp # List docker ports vssh ldn # List docker networks vssh sdi # Show docker info # Coolify plugin commands vssh gcp # Get coolify proxy config vssh lcd # List coolify dynamic configs # Grafana plugin commands (auto-discovers on first use) vssh lgd # List grafana dashboards vssh vgd "metrics" # View dashboard by name/search # File editor plugin commands vssh edit-file /etc/app.conf --search "localhost" --replace "example.com" vssh ef config.yml --regex "version: \d+" --with "version: 2" vssh ef script.sh --insert-at 0 --content "#!/bin/bash" vssh ef app.js --dry-run --edits '[{"type":"replace","search":"console.log","replace":"//console.log"}]' # Plugin management vssh plugins list # List all plugins vssh plugins enable docker # Enable a plugin vssh plugins info docker # Show plugin details ``` ## Plugin System vssh features a plugin architecture that extends functionality while maintaining safety and MCP compatibility. ### Built-in Plugins #### File Transfer Plugin Native SFTP file transfers with intelligent directory handling: - `upload` (push, put) - Upload files or directories to server - `download` (pull, get) - Download files or directories from server - **Automatic directory compression**: - Detects directories automatically - Creates tar.gz archives on-the-fly - Extracts after transfer - Auto-cleanup of temporary archives - Progress indicators and file size reporting - Works seamlessly with both single files and entire directory trees - Perfect for deploying code, backing up data, or syncing configurations #### Docker Plugin Comprehensive Docker management commands: - `list-docker-containers` (ldc) - List all containers - `get-docker-container` (gdc) - Find specific container - `show-docker-logs` (sdl) - View container logs - `list-docker-ports` (ldp) - Show port mappings - `list-docker-networks` (ldn) - List networks - `show-docker-info` (sdi) - System information dashboard #### Coolify Plugin Coolify-specific operations: - `get-coolify-proxy-config` (gcp) - Traefik proxy configuration - `list-coolify-dynamic-configs` (lcd) - Dynamic configurations #### Grafana Plugin Grafana dashboard management with auto-discovery: - `list-grafana-dashboards` (lgd) - List all dashboards with auto-discovery - `view-grafana-dashboard` (vgd) - View dashboard details by name/search - Auto-discovers Grafana containers and credentials on first use - Securely stores credentials with AES-256-GCM encryption - No manual configuration required #### File Editor Plugin Advanced file editing capabilities: - `edit-file` (ef) - Edit files with sophisticated operations - Supports multiple edit types: - Simple search and replace - Regular expression replacements with flags - Line insertion (by number, after/before pattern) - Line deletion (single line or range) - Complex multi-operation edits via JSON - Safety features: - Automatic backup creation (`.vssh.backup`) - Dry-run mode to preview changes - System file protection - Works with both local and remote files ### Managing Plugins ```bash # List all plugins and their status vssh plugins list # Enable/disable plugins vssh plugins enable docker vssh plugins disable coolify # Get detailed plugin information vssh plugins info docker ``` ### Plugin Benefits - **Modular**: Enable only what you need - **Safe**: Plugins can add custom safety guards - **MCP-Ready**: All plugin commands are exposed as MCP tools - **Extensible**: Easy to create custom plugins - **Smart Dependencies**: Automatic runtime dependency checking ### Plugin Development Creating a vssh plugin is straightforward: ```typescript import { VsshPlugin } from '@vssh/types'; const myPlugin: VsshPlugin = { name: 'my-plugin', version: '1.0.0', description: 'My custom plugin', // Declare runtime dependencies runtimeDependencies: [ { command: 'kubectl', displayName: 'Kubernetes CLI', checkCommand: 'kubectl version --client', installHint: 'Install kubectl from https://kubernetes.io/docs/tasks/tools/' } ], // Plugin commands commands: [ { name: 'list-pods', aliases: ['lp'], description: 'List Kubernetes pods', handler: async (context) => { // Your command logic here } } ], // Optional MCP tool definitions mcpTools: [ { name: 'list_k8s_pods', description: 'List all Kubernetes pods', inputSchema: { type: 'object', properties: {} } } ], // Optional safety guards commandGuards: [ { category: 'kubernetes', patterns: [/kubectl\s+delete\s+namespace/], message: 'Deleting namespaces is dangerous', suggestion: 'Use kubectl delete pod instead' } ] }; export default myPlugin; ``` ### Runtime Dependencies vssh automatically checks runtime dependencies before executing plugin commands: - **Automatic Detection**: Checks if required tools are installed where needed - **Mode Aware**: Checks locally in local mode, on server in remote mode - **Clear Error Messages**: Users get helpful installation instructions - **Optional Dependencies**: Some dependencies can be marked as optional - **Cached Results**: Dependency checks are cached for performance Example dependency error: ``` ❌ Missing required dependencies: • Docker is not installed on the server. Please install Docker from https://docker.com ``` ## AI Workflows ### Key Benefits - MCP-native support with automatic tool exposure - Specialized plugin commands for Docker, Coolify, Grafana, file editing - No quote escaping complexity in permission systems - Simple patterns like `Bash(vssh:*)` work consistently - Structured output for AI interpretation - Multi-layer protection against dangerous commands - Context-aware help system shows available commands ### Common AI Tasks ```bash # Docker Management (via plugin) vssh ldc # Quick container list vssh sdl myapp --tail 50 # View logs easily vssh sdi # Full system dashboard # System Monitoring vssh df -h vssh free -m vssh 'ps aux | head -20' # Coolify Operations (via plugin) vssh gcp # Get proxy configuration vssh lcd # List dynamic configs # Direct Commands vssh cat /etc/nginx/nginx.conf vssh 'find /var/log -name "*.log" -size +100M' # Local Execution Mode vssh local-mode status # Check current mode vssh local-mode on # Enable local execution vssh --local docker ps # One-off local command ``` ### Dynamic Help System vssh features a comprehensive, plugin-aware help system that automatically shows available commands based on enabled plugins: ```bash vssh --help # or vssh, vssh help, vssh -h ``` **Key features:** - **Categorized Display**: Commands organized by category (Core, Infrastructure, Monitoring, File Management) - **Plugin-Aware**: Only shows commands from enabled plugins - **Rich Examples**: Each plugin provides key commands and usage examples - **AI-Optimized**: Immediate visibility of all available commands for quick agent onboarding **Example output:** ``` AVAILABLE COMMANDS BY CATEGORY: Core: Core proxy commands - proxy/run/exec (execute commands), lm (local mode toggle) vssh proxy "ls -la" # Execute command remotely vssh run "docker ps" # Same as proxy Infrastructure: Docker container management - ldc (list), gdc (get), sdl (logs), ldp (ports), ldn (networks), sdi (info) vssh ldc # List all containers vssh gdc myapp # Find container by name File Management: Advanced file editing - ef (edit-file) with search/replace, regex, insert, delete operations vssh ef config.yml --search "localhost" --replace "example.com" ``` This ensures that both AI assistants and human users can quickly discover and understand all available functionality. ## Configuration Configuration is stored in `~/.vssh/config.json`: ```json { "host": "your-server.com", "user": "root", "keyPath": "/Users/you/.ssh/id_rsa", "localMode": false, "encryptionKey": "<auto-generated-base64-key>", "plugins": { "enabled": ["docker", "coolify"], "disabled": ["grafana"], "config": { "docker": {}, "coolify": {} } } } ``` You can also use environment variables: - `VSSH_HOST` or `SSH_HOST` - Target server - `VSSH_USER` - SSH username (default: root) - `VSSH_KEY_PATH` - Path to SSH key ## Safety Features Multi-layer protection system: ### Core Guards - Root filesystem deletion prevention - Direct disk write operation blocking - Mass Docker destruction protection - Critical service disruption prevention - System shutdown/reboot blocking ### Plugin Guards - Plugins can add custom safety rules - Coolify plugin protects configuration directories - Extensible for domain-specific safety All blocked commands are logged to `~/.vssh/data/logs/blocked_commands.log`. ## Data Storage vssh stores all data in your home directory: ``` ~/.vssh/ ├── config.json # SSH configuration with encryption key ├── plugins/ │ └── grafana.enc # Encrypted Grafana credentials └── data/ └── logs/ ├── proxy_commands.log # Command history └── blocked_commands.log # Blocked attempts ``` ## Development ```bash # Clone the repository git clone https://github.com/light-merlin-dark/vssh.git cd vssh # Install dependencies bun install # Run in development mode bun run dev # Build for production bun run build # Run tests bun test ``` ### Testing Philosophy vssh uses **Bun's native test runner** with a **plugin-centric testing approach** that promotes modularity and independence: - **Core Tests** (`/tests`): Validate the framework, plugin system, and core utilities only - **Plugin Tests** (`/src/plugins/*/tests`): Each plugin manages its own test suite - **Bun Test Runner**: Significantly faster than traditional test frameworks - **No Watch Mode**: Tests run once and complete quickly for deterministic results - **Minimal Logging**: Tests run silently unless errors occur This separation ensures plugins remain truly independent while leveraging shared testing utilities. Bun's built-in test runner provides excellent performance without additional dependencies. ```bash # Run core framework tests only bun test # Run all plugin tests bun run test:plugins # Run everything (core + plugins) bun run test:all # Test a specific plugin bun run test:plugin docker # List available plugins with test status bun run test:list-plugins ``` For detailed testing documentation, see [docs/testing.md](docs/testing.md). ## License MIT License - see [LICENSE](LICENSE) file for details. --- Built by [Robert E. Beckner III (Merlin)](https://rbeckner.com)