hop について
hop は、MCP サーバーを内蔵した SSH 接続マネージャーです。AI アシスタントが複数のサーバーで接続の検索、コマンド実行、状態確認を行えます。多数のホストにログインする運用担当者や開発者を想定し、あいまい一致による短い接続コマンドを提供します。
主な機能
- 01接続先のあいまい一致検索
- 02TUI ダッシュボードによる接続管理
- 03~/.ssh/config からのインポート
- 04複数サーバーへのコマンド一括実行
- 05踏み台サーバー向け ProxyJump 対応
- 06AI アシスタント向け MCP サーバー機能
活用シーン
- 01hop prod による本番サーバーへの接続
- 02AI アシスタントによる複数プロジェクトのサーバー状態確認
- 03サーバーグループでの uptime などのコマンド実行
MCP 対応
hop は MCP サーバーとして動作し、接続検索、コマンド実行、状態確認の機能を AI アシスタントに公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
hop
長い SSH コマンドを入力するのはやめましょう。hop prod を実行するだけで接続できます。
hop を選ぶ理由
# Before: remembering and typing this every time
ssh -i ~/.ssh/work_key [email protected] -p 2222
# After
hop prod
hop prod # fuzzy match any server
hop exec production "uptime" # run command on all prod servers
hop import # import your existing ~/.ssh/config
hop # launch the TUI, manage everything
インストール
Homebrew(macOS/Linux)
brew install danmartuszewski/tap/hop
Go
go install github.com/danmartuszewski/hop/cmd/hop@latest
ソースからインストール
git clone https://github.com/danmartuszewski/hop.git && cd hop && make build
./bin/hop
AI エージェントを使ってインストール
Claude Code、Codex、Cursor、または別のコーディングエージェントを使っていますか? 以下のブロックをエージェントに貼り付けると、お使いのマシンに適したインストール方法を選び、hop の MCP サーバーを登録して、インストールを検証します。
Install hop on this machine and register its MCP server. Do the steps in order;
stop and report on the first failure.
1. Pick ONE install method, in this priority:
a. Homebrew (macOS or Linux):
brew install danmartuszewski/tap/hop
b. Go 1.26+ available:
go install github.com/danmartuszewski/hop/cmd/hop@latest
c. From source (no brew, no Go on PATH):
git clone https://github.com/danmartuszewski/hop.git && cd hop && make install
2. Verify the binary is on PATH:
hop version
3. Register the MCP server with whichever agent the user is running. Skip
clients the user does not use:
- Claude Code: claude mcp add hop -- hop mcp
- Codex CLI: codex mcp add hop -- hop mcp
- Claude Desktop / Cursor / Windsurf — add to the client's MCP config:
{ "hop": { "command": "hop", "args": ["mcp"] } }
4. (Optional) Seed the config from the user's existing SSH config. Preview
first; --yes is required for a non-interactive run:
hop import --dry-run
hop import --yes
5. Confirm hop's MCP tools are reachable from the agent (e.g. list_connections).
Constraints:
- Do NOT run bare `hop` — it launches an interactive TUI and will hang a
non-interactive session. Use subcommands (`hop version`, `hop list`, …).
- Do NOT modify ~/.ssh/config. hop reads it via `hop import` only.
- Do NOT commit secrets or identity files.
After step 3, restart the agent so it picks up the new MCP server.
機能
- あいまい検索 -
hop prodと入力すると、app-server-prod-03に接続します - TUI ダッシュボード - キーボードまたはマウスで接続を閲覧、追加、編集、削除できます
- SSH 設定のインポート -
~/.ssh/configにすでにサーバーが登録されていますか? 1 つのコマンドでインポートできます - エクスポート - 絞り込んだ接続を YAML にエクスポートして共有やバックアップに利用できます
- 複数サーバーでのコマンド実行 - 複数のサーバーでコマンドを一度に実行できます
- グループとタグ - プロジェクト、環境、またはカスタムタグで整理できます
- ジャンプホスト - 踏み台サーバー向けの ProxyJump に対応しています
- 接続時のディレクトリ - 接続時に、あらかじめ指定した作業ディレクトリに直接移動します
- MCP サーバー - AI アシスタントでサーバーを管理できます。接続の検索、コマンドの実行、プロジェクト間のステータス確認が可能です
- Mosh 対応 - ローミングや不安定な接続では、SSH の代わりに mosh を使用できます
- 依存関係ゼロ - 単一のバイナリで、どこでも動作します
すべての機能を実際に見る: デモ録画
Raycast 拡張機能
Raycast から接続を直接起動できます。あいまい検索、タグ、環境をすぐに利用できます。
設定
設定ファイルの場所:~/.config/hop/config.yaml
version: 1
defaults:
user: admin
port: 22
# use_mosh: true # Uncomment to use mosh for all connections
connections:
- id: prod-web
host: web.example.com
user: deploy
identity_file: ~/.ssh/work_key # Private key for this connection
remote_dir: /var/www/myapp # Land in this directory on connect
project: myapp
env: production
tags: [web, prod]
- id: prod-db
host: db.example.com
user: dbadmin
port: 5432
project: myapp
env: production
tags: [database, prod]
- id: staging
host: staging.example.com
user: deploy
project: myapp
env: staging
- id: private-server
host: 10.0.1.50
user: admin
proxy_jump: bastion # Connect via jump host
forward_agent: true # Forward SSH agent
- id: remote-dev
host: dev.example.com
user: dan
use_mosh: true # Use mosh instead of SSH
groups:
production: [prod-web, prod-db]
web-servers: [prod-web, staging]
セキュリティに関する注意:
forward_agent: trueを設定すると、リモートサーバーで root アクセス権を持つすべてのユーザーに SSH キーが公開されます。完全に信頼できるサーバーでのみ有効にしてください。踏み台を経由して内部ホストに接続するだけの場合は、代わりにproxy_jumpの使用を検討してください。
Mosh のサポート
Mosh(モバイルシェル)は、不安定なネットワーク経由での接続に便利です。ローミング、断続的な接続、高レイテンシを適切に処理します。
グローバル設定 — すべての接続で Mosh を有効にします:
defaults:
use_mosh: true
connections:
- id: remote-dev
host: dev.example.com
- id: legacy-server
host: old.example.com
use_mosh: false # Override: use SSH for this one
接続ごとの設定 — 特定の接続で Mosh を有効にします:
connections:
- id: remote-dev
host: dev.example.com
user: dan
use_mosh: true
一時的な設定 — 設定を変更せずに --mosh フラグを使用します:
hop connect myserver --mosh
hop myserver --mosh
接続ごとの use_mosh: false は、グローバル設定より優先されます。SSH オプション(ポート、ID ファイル、プロキシジャンプ、エージェント転送)は、Mosh の --ssh フラグを通じて自動的に渡されます。Mosh を利用するには、ローカルの mosh-client とリモートホストの mosh-server の両方が必要です。
注:
hop execは、use_moshの設定にかかわらず常に SSH を使用します。Mosh は対話型セッション向けに設計されているためです。
接続時のディレクトリ
remote_dir を設定すると、接続時に $HOME ではなく指定したディレクトリに直接移動できます:
connections:
- id: prod-web
host: web.example.com
user: deploy
remote_dir: /var/www/myapp # cd here on connect
- id: my-dev
host: dev.example.com
remote_dir: ~/projects/api # ~ is expanded on the remote host
接続すると、hop はそのディレクトリに cd してから、通常の対話型ログインシェルを起動します。そのため、接続先が異なるだけで、セッションの動作は通常の SSH ログインとまったく同じです。知っておくと便利な点をいくつか紹介します。
- 絶対パスと
~の両方を使用できます。~と~userはリモートシェルで展開されます。 - 柔軟に動作するよう設計されています。 ディレクトリが存在しないかアクセスできない場合でも、ホストから切断されることなく、シェル(
$HOME)に移動します。 - 新しいタブでも動作します。
hop openは、起動するすべてのターミナルに接続時のディレクトリを引き継ぎます。
注: 明示的なコマンド(例:
hop connect web -- uptimeまたはhop exec)を渡した場合、remote_dirは無視されます。これらは対話型セッションではないためです。
TUI ダッシュボード
hop または hop dashboard で起動します。
ダッシュボードからサーバーに接続すると(Enter キーを押すと)、SSH セッションが開始され、セッション終了後にダッシュボードへ自動的に戻ります。これにより、TUI を毎回再起動することなく、サーバー間をすばやく移動できます。
ターミナルに戻るワンショット接続には、次を使用します。
hop <query> # fuzzy match and connect
hop connect <id> # connect by exact ID
キーボードショートカット
| キー | 操作 |
|---|---|
↑/k | 上へ移動 |
↓/j | 下へ移動 |
PgUp/PgDn | ページ単位で移動 |
g | 先頭へ移動 |
G | 末尾へ移動 |
/ | 接続を絞り込む(複数キーワードの AND 検索に対応) |
t | タグで絞り込む |
r | 最近使った順の切り替え |
Enter | 選択した接続に接続 |
a | 新しい接続を追加 |
i | SSH 設定からインポート |
p | SSH 文字列を貼り付け(クイック追加) |
e | 選択した項目を編集 |
c | 選択した項目を複製(入力済みのコピーを開く) |
d | 選択した項目を削除 |
x | 接続を YAML にエクスポート |
y | SSH コマンドをコピー |
T | テーマ選択を開く |
? | ヘルプを表示 |
q | 終了 |
接続の絞り込み
/ を押してキーワードを入力すると、接続を絞り込めます。このフィルターは複数キーワードの AND ロジックに対応しており、キーワードをスペースで区切ると、すべての語句に一致する接続を検索できます。
例:
prod— 「prod」を含む接続に一致しますprod web— 「production」と「web」の両方を含む接続に一致しますkaf staging— 「kafka」と「staging」の両方を含む接続に一致します
フィルターは、接続 ID、ホスト、プロジェクト、環境、タグを対象に検索します。
貼り付けによるクイック追加
p を押して、次のいずれかの形式を貼り付けます。
[email protected]
[email protected]:2222
ssh [email protected] -p 2222
ssh://user@host:port
各項目が入力済みの状態で、接続フォームが開きます。
接続の複製
接続上で c を押すと、コピーを作成できます。追加フォームが開き、プロキシジャンプや mosh など、フォームに表示されないオプションも含めて、元の接続のすべての項目が入力済みになります。また、重複しない ID の候補も表示されます(例:web-prod → web-prod-copy)。必要な箇所を調整して保存してください。すでに存在する ID を選んだ場合は、編集内容を保持したままフォームが開いているため、修正できます。
SSH 設定からのインポート
既存の接続を ~/.ssh/config ファイルからインポートします。
ダッシュボードから: i を押してインポートモーダルを開き、インポートする接続を選択して Enter を押します。
CLI から:
hop import # Import from ~/.ssh/config
hop import --dry-run # Preview what would be imported
hop import --file ~/.ssh/config.d/work # Import from custom path
インポートされる項目:
- ホストエイリアスが接続 ID になります
- HostName、User、Port、IdentityFile
- ジャンプホスト接続の ProxyJump
- ForwardAgent の設定
スキップされる項目:
- ワイルドカードパターン(
Host *、Host *.example.com) - HostName のないエントリ(エイリアスがホスト名として使用されます)
競合時の処理: 接続 ID がすでに存在する場合、インポートした接続の名前に -imported の接尾辞が付けられます(例:myserver → myserver-imported)。
接続のエクスポート
共有、バックアップ、または別のマシンへの転送のために、接続の一部を YAML ファイルにエクスポートします。
ダッシュボードから: x を押してエクスポートモーダルを開きます。現在、フィルターに一致している接続のみが表示されるため、選択範囲を絞り込むには、先にテキストまたはタグのフィルターを適用してください。Space で項目を切り替え、Enter を押して保存します。
CLI から:
hop export --all # Export all to stdout
hop export --all -o backup.yaml # Export all to a file
hop export --project myapp -o myapp.yaml # Export by project
hop export --tag database # Export by tag
hop export --env production # Export by environment
hop export --id web-1,web-2 # Export specific connections
少なくとも 1 つのフィルターフラグ、または --all が必要です。フィルターは AND ロジックで組み合わされます。
テーマ設定
ダッシュボードには16種類のカラープリセットが用意されています。人気のテーマはそれぞれダーク版とライト版が別々に登録されているため、ターミナルの背景にかかわらず好きな方を選べます。Tを押すと、ライブプレビューを見ながらテーマを選べます。↑/↓で移動し、Enterで設定ファイルに選択を保存し、Escで元に戻します。
| ファミリー | ダーク | ライト |
|---|---|---|
| 組み込みのhop | default-dark | default-light |
| Everforest | everforest-dark | everforest-light |
| Gruvbox | gruvbox-dark | gruvbox-light |
| Catppuccin | catppuccin-mocha | catppuccin-latte |
| Tokyo Night | tokyo-night-storm | tokyo-night-day |
| Solarized | solarized-dark | solarized-light |
| Nord | nord | nord-light |
| Dracula | dracula | alucard |
プリセットを選ぶと、設定ファイルに1行が書き込まれます。
theme_preset: everforest-dark
theme_presetが未設定の場合、hopはターミナルの背景に応じてdefault-darkまたはdefault-lightを自動的に選択します。
カスタム上書き
任意のプリセットに独自のカラーを重ねて設定できます。
theme_preset: everforest-dark # optional; omit to auto-pick default
theme: # applies to every preset
primary: "#0066cc"
theme_dark: # only applies when the preset is a dark variant
selection: "#1f1f28"
theme_light: # only applies when the preset is a light variant
foreground: "#1c1f24"
カラー値には、引用符で囲んだANSI 256コード("39")または16進文字列("#bd93f9")を指定できます。ANSIコードはターミナルのパレットに合わせて変化し、16進値は固定です。
使用可能なキーは、primary、secondary、accent、success、warning、error、muted、selection、foregroundです。設定しなかったキーは、プリセットの値が使われ、それもなければ組み込みのデフォルト値が使われます。
CLI コマンド
hop # Open TUI dashboard
hop <query> # Fuzzy match and connect
hop connect <id> # Connect by exact ID
hop get <id> <field> # Print single field value to stdout
hop get <id> f1,f2,f3 # Print multiple fields tab-separated
hop get <id> # Print all fields as "key value" lines
hop get --help # Full field list and flags
hop list # List all connections
hop list --json # List as JSON
hop list --flat # Flat list without grouping
hop import # Import from ~/.ssh/config
hop import --file <path> # Import from custom path
hop import --dry-run # Preview without importing
hop export --all # Export all connections to stdout
hop export --project <name> # Export filtered connections
hop export --tag <tag> -o f # Export to file
hop open <target...> # Open multiple terminal tabs
hop exec <target> "cmd" # Execute command on multiple servers
hop resolve <target> # Test which connections a target matches
hop mcp # Start MCP server (read-only)
hop mcp --allow-exec # Start MCP server with remote exec
hop version # Show version
ターゲットの指定
execやopenなどのコマンドでは、1つ以上の接続に解決されるターゲットを指定できます。ターゲットは次の順序で照合されます。
- 名前付きグループ — 設定ファイルの
groups:で定義した、接続IDの明示的なリスト - プロジェクト・環境パターン —
projectフィールドとenvフィールドで接続を照合します(例:myapp-prodはproject: myappかつenv: prodのすべての接続に一致します) - グロブパターン — 接続IDに対するワイルドカード照合(例:
web*、*-prod-*) - ファジーマッチ — 最後に、単一の接続IDに対するファジーマッチを試みます
--tagを使うと、任意のターゲットをタグで絞り込むこともできます。
実行前にターゲットに一致する接続を確認するには、hop resolveを使います。
hop resolve production # see what "production" resolves to
hop resolve "web*" # test a glob pattern
hop resolve myapp-prod --tag=web # combine target + tag filter
例
# Fuzzy connect
hop prod # matches "prod-web", "prod-db", etc.
hop web # matches first *web* server
# Multi-exec with different target types
hop exec production "uptime" # named group
hop exec myapp-prod "df -h" # project-env pattern
hop exec "web*" "systemctl status" # glob pattern
hop exec --tag=database "psql -c '\\l'" # tag filter
# Open multiple tabs
hop open production # named group
hop open web1 db1 api1 # specific IDs
hop open myapp-prod -- "htop" # with initial command
# List connections
hop list --flat
hopを使ったスクリプト作成
hop getは接続フィールドを標準出力に出力するため、シェルのパイプラインやコマンド置換にそのまま渡せます。hopの設定に対するssh -Gのようなものです。
# Build an ssh invocation from config:
ssh -i "$(hop get prod identity_file)" "$(hop get prod user)@$(hop get prod host)"
# Read multiple fields at once (tab-separated):
IFS=$'\t' read -r host port user < <(hop get prod host,port,user)
# Fallback when a field is empty:
hop get prod port --default 22
# Strict shells: suppress the trailing newline.
hop get prod host -n
# Dump all non-empty scalar fields (ssh -G style "key value" lines):
hop get prod
# Read a single SSH option by key:
hop get prod options.StrictHostKeyChecking
# Structured output for jq and friends:
hop get prod host,port --json | jq -r .host
照合は完全なID一致のみ(ファジーマッチなし)なので、スクリプト内でも安全に使えます。不明なIDを指定すると、「もしかして」という候補を示して終了コード1で終了します。使用できるフィールドの一覧は、hop get --helpを参照してください。
MCP サーバー(AI アシスタント連携)
hopには、組み込みのModel Context Protocolサーバーがあり、Claude CodeやCodexなどのAI アシスタントからサーバーを直接管理できます。本番環境全体のディスク容量の確認、ステージング環境のサービス再起動、プロジェクトに属するサーバーの検索などをアシスタントに依頼できます。アシスタントは接続を検出してターゲットを解決し、hopを通じてコマンドを実行します。
セットアップ
Claude Code:
claude mcp add hop -- hop mcp
Codex CLI:
codex mcp add hop -- hop mcp
Claude Desktop — 設定ファイル(~/Library/Application Support/Claude/claude_desktop_config.json)に追加します:
{
"mcpServers": {
"hop": {
"command": "hop",
"args": ["mcp"]
}
}
}
Codex — ~/.codex/config.tomlに追加します:
[mcp_servers.hop]
command = "hop"
args = ["mcp"]
または、Claude Desktopの設定ファイルを自動生成します:
hop mcp --print-client-config # read-only
hop mcp --print-client-config --allow-exec # with remote exec enabled
ツール
デフォルトでは、読み取り専用のツールのみが公開されます。
| ツール | 説明 |
|---|---|
list_connections | 接続を一覧表示し、プロジェクト/環境/タグで絞り込みます |
search_connections | すべての接続を対象にあいまい検索します |
get_connection | 特定の接続の詳細を取得します |
resolve_target | ターゲットパターンの解決結果をプレビューします |
list_groups | 名前付きグループをすべて一覧表示します |
get_history | 接続の使用履歴を取得します |
build_ssh_command | SSH コマンド文字列全体を生成します |
リモートコマンドの実行を有効にするには、--allow-exec を指定して起動します。
claude mcp add hop -- hop mcp --allow-exec
codex mcp add hop -- hop mcp --allow-exec
これにより、出力上限付きで一致したサーバー上のシェルコマンドを実行する exec_command ツールが追加されます(ホストごとに stdout と stderr はそれぞれ 64 KiB、最大 50 ホスト)。出力は取得中に上限で制限され、超過分は破棄され、応答で切り詰められたことが示されます。
リソース
サーバーは、参照可能なリソースも公開します。
| URI | 説明 |
|---|---|
hop://config | 設定の概要(件数、プロジェクト、環境) |
hop://connections | すべての接続 |
hop://connections/{id} | 個々の接続の詳細 |
hop://groups | すべてのグループとメンバー |
セキュリティ
- ID ファイル(SSH キーのパス)が MCP 経由で公開されることはありません
- リモート実行はデフォルトで無効になっており、明示的に
--allow-execを指定する必要があります - JSON-RPC トランスポートをクリーンに保つため、すべてのログは stderr に出力されます
シェル補完
# Bash (Linux)
hop completion bash | sudo tee /etc/bash_completion.d/hop > /dev/null
# Bash (macOS with Homebrew)
hop completion bash > $(brew --prefix)/etc/bash_completion.d/hop
# Zsh (add to ~/.zshrc)
source <(hop completion zsh)
# Fish
hop completion fish > ~/.config/fish/completions/hop.fish
フラグ
-c, --config <path> # Use custom config file
-v, --verbose # Verbose output
-q, --quiet # Suppress non-essential output
--dry-run # Print SSH command without executing
--mosh # Use mosh instead of SSH for this connection
ビルド
make build # Build binary to ./bin/hop
make test # Run tests
make test-race # Run tests with race detection (also used in CI)
make vuln # Scan for reachable Go vulnerabilities
make test-docker # Run tests in Docker (isolated)
make install # Install to $GOPATH/bin
make docker # Build Docker image
メンテナンス
依存関係のメンテナンスは、Go モジュール(ピン留めされた脆弱性スキャナーを含む)、GitHub Actions、Docker イメージを対象に Dependabot で設定されています。週次でチェックが実行され、レビュー用のプルリクエストが作成されます。Go のマイナーアップデートとパッチアップデートはグループ化され、メジャーアップデートは個別のままです。
Security ワークフローは、プルリクエスト、main へのプッシュ、週次スケジュールで make vuln を実行します。GitHub Actions から手動で開始することもできます。到達可能な脆弱性が見つかった場合、チェックは失敗します。スキャンに標準ライブラリの最新の修正も反映されるよう、パッチ適用済みのサポート対象 Go ツールチェーンを使ってローカルで実行してください。
Docker
# Build image
docker build -t hop .
# Run interactively
docker run -it --rm hop
# Run tests in container
docker build --target tester -t hop-test .
プロジェクト構成
hop/
├── cmd/hop/ # Main entry point
├── internal/
│ ├── cmd/ # CLI commands (cobra)
│ ├── config/ # Configuration loading/saving
│ ├── export/ # Export logic
│ ├── fuzzy/ # Fuzzy matching
│ ├── mcp/ # MCP server (tools, resources, types)
│ ├── picker/ # Connection picker (promptui)
│ ├── resolve/ # Target resolution logic
│ ├── ssh/ # SSH connection handling
│ ├── sshconfig/ # SSH config parsing
│ └── tui/ # TUI dashboard (bubbletea)
├── Dockerfile
├── Makefile
└── README.md
ライセンス
MIT ライセンスです。詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。