hop is a fast, elegant SSH connection manager that provides a TUI dashboard and an MCP server, so you no longer have to type lengthy SSH commands—just type hop prod to connect to app-server-prod-03.
Key capabilities
- Fuzzy matching: type hop prod to connect to app-server-prod-03.
- TUI dashboard: browse, add, edit, and delete connections with the keyboard or mouse.
- SSH config import: servers already in ~/.ssh/config can be imported with a single command.
- Export: export filtered connections as YAML for easy sharing or backup.
- Multi-exec: run commands on multiple servers at the same time.
- Groups and tags: organize connections by project, environment, or custom tags.
- Jump host: support bastion servers via ProxyJump.
- Landing directory: go directly into a preset working directory after connecting.
- MCP server: let AI assistants manage your servers—search connections across projects, run commands, and check status.
- Mosh support: use mosh instead of SSH on unstable or roaming networks.
- Zero dependencies: a single binary that works anywhere.
How to use
Installation
- Homebrew (macOS/Linux)
- Can be installed using an AI agent: paste the installation instructions block into Claude Code, Codex, Cursor, or another coding agent, and the agent will choose the correct installation path for your machine, register hop's MCP server, and verify the installation.
Common usage
- Start the dashboard: run hop or hop dashboard. After pressing Enter in the dashboard to connect to a server, you will automatically return to the dashboard when the SSH session ends, making it easy to quickly jump between servers.
- One-off connection: you can use a command to connect directly and return to the terminal after exiting.
- Filter connections: press / and then enter keywords to filter, with support for multi-keyword AND logic (separated by spaces); the search scope includes connection ID, host, project, environment, and tags.
- Quick add: press p and then paste content in the specified format, and the connection form will be prefilled with the fields.
- Copy connection: press c to copy any connection, and the form will be prefilled with all fields from the original connection (including options not shown in the form, such as proxy jump and mosh), and suggests a conflict-free ID (e.g., web-prod → web-prod-copy). If the chosen ID already exists, the form keeps the edited content so it can be corrected.
- Import from SSH config: in the dashboard, press i to open the import dialog, select the connections to import, and press Enter.
- Export connections: in the dashboard, press x to open the export dialog, which shows only the currently filtered connections; use Space to toggle selection and press Enter to save. At least one filter flag or --all is required.
SSH Config Import Details
What is imported: the Host alias becomes the connection ID; HostName, User, Port, IdentityFile; ProxyJump (used for jump host connections); ForwardAgent settings. Skipped: wildcard patterns (Host *, Host *.example.com); entries without HostName (the alias is used as the hostname). Conflict handling: if the connection ID already exists, the imported connection is renamed with an -imported suffix (e.g., myserver → myserver-imported).
Themes and Colors
The dashboard includes sixteen built-in color presets, and every popular theme has both a dark and a light variant that can be selected independently. Press T to browse and preview in real time: ↑/↓ to navigate, Enter to save the selection to the config, Esc to revert. Selecting a preset writes one line to the config. When theme_preset is not set, hop automatically chooses default-dark or default-light based on the terminal background. Custom colors can be layered on top of any preset: color values can be a quoted ANSI 256 code ("39") or a hex string ("#bd93f9"). ANSI codes adapt to the terminal palette, while hex values are absolute. Available keys: primary, secondary, accent, success, warning, error, muted, selection, foreground. Unset keys fall back in order to the preset and then to the built-in defaults.
Target Resolution
Commands such as exec and open accept a target that resolves to one or more connections, matched in this order: named groups (a list of connection IDs explicitly defined under groups:); project-environment pattern (matched by the project and env fields, such as myapp-prod matches all connections with project: myapp and env: prod); wildcard patterns (perform wildcard matching against connection IDs, such as web*, -prod-); fuzzy matching (falls back to fuzzy matching against individual connection IDs). You can also use --tag to filter any target by tag. Use hop resolve to preview which connections a target will match before actually running it.
Scripting
hop get prints connection fields to stdout, ready for shell pipelines and command substitution, essentially the ssh -G of hop config. Matching is limited to exact IDs (non-fuzzy), which is safer in scripts; an unknown ID exits with code 1 and gives a "did you mean" hint. See hop get --help for the full field list.
MCP Server (AI assistant integration)
hop has a built-in Model Context Protocol server, letting AI assistants such as Claude Code and Codex manage servers directly. You can have the assistant check disk space in production, restart a service in staging, or find which servers are under a project—it will discover connections, resolve targets, and execute commands through hop.
Claude Desktop: add to the config file (~/Library/Application Support/Claude/claude_desktop_config.json). Codex: add to ~/.codex/config.toml. Claude Desktop config can also be generated automatically.
By default only read-only tools are exposed. To enable remote command execution, start with --allow-exec, which adds the exec_command tool to run shell commands on matching servers, with output limits (64 KiB each for stdout and stderr per host, up to 50 hosts). Output is truncated at capture time; excess output is discarded and marked as truncated in the response.
The server also exposes browsable resources. Identity files (SSH key paths) are never exposed through MCP. Remote execution is disabled by default and requires explicit --allow-exec. All logs go to stderr to keep the JSON-RPC transport clean.
Mosh support
Mosh (mobile shell) works well on unstable networks—handling roaming, intermittent connectivity, and high latency gracefully.
- Global default: enable mosh for all connections.
- Per-connection: enable mosh for a specific connection.
- One-off: use the --mosh flag without changing configuration.
A per-connection use_mosh: false overrides the global default. SSH options (port, identity file, proxy jump, agent forwarding) are passed automatically through mosh's --ssh flag. Mosh requires a local mosh-client and a mosh-server on the remote host. Note: hop exec always uses SSH regardless of the use_mosh setting, because mosh is designed for interactive sessions.
Landing directory
Setting remote_dir lets a connection go directly into a specified directory instead of $HOME. On connect, hop cds into that directory, then hands you a normal interactive login shell, with session behavior exactly like a regular SSH login, just in a different location. Key points: both absolute paths and ~ work, ~ and ~user are expanded by the remote shell; by design it is very forgiving—if the directory is missing or inaccessible, you still get a shell (in $HOME) rather than being dropped off the host; it also works in new tabs, and hop open carries the landing directory into every terminal it launches. Note: when an explicit command is passed (such as hop connect web -- uptime or hop exec), remote_dir is ignored, because those are not interactive sessions.
Shell completion
Shell completion is provided (see the project documentation for the specific commands).
Dependency maintenance and security
Dependency maintenance is configured via Dependabot, covering Go modules (including a pinned version of the vulnerability scanner), GitHub Actions, and Docker images. It checks weekly and opens pull requests for review. Go minor and patch updates are grouped; major updates are kept separate. The Security workflow runs make vuln on pull requests, pushes to main, and a weekly schedule, and can also be started manually from GitHub Actions. Finding a reachable vulnerability fails the check. Run locally with a patched and supported Go toolchain so the scan also reflects current standard library fixes.
Project structure
See the repository.
License
MIT License - see LICENSE.
Configuration and security notes
Configuration file location: ~/.config/hop/config.yaml.
Security note: forward_agent: true exposes your SSH keys to anyone with root privileges on the remote server. Enable this only for servers you fully trust. When you just need to reach internal hosts through a bastion host, consider using proxy_jump.
Raycast extension
Launch connections directly from Raycast, with fuzzy search, tags, environments, and more. Installable from the Raycast Store.