mcpField
H
hop

hop

ローカル
github.com/danmartuszewskiクラウド・インフラ642 週間前に更新

hop について

hop は、MCP サーバーを内蔵した SSH 接続マネージャーです。AI アシスタントが複数のサーバーで接続の検索、コマンド実行、状態確認を行えます。多数のホストにログインする運用担当者や開発者を想定し、あいまい一致による短い接続コマンドを提供します。

主な機能

  1. 01接続先のあいまい一致検索
  2. 02TUI ダッシュボードによる接続管理
  3. 03~/.ssh/config からのインポート
  4. 04複数サーバーへのコマンド一括実行
  5. 05踏み台サーバー向け ProxyJump 対応
  6. 06AI アシスタント向け MCP サーバー機能

活用シーン

  1. 01hop prod による本番サーバーへの接続
  2. 02AI アシスタントによる複数プロジェクトのサーバー状態確認
  3. 03サーバーグループでの uptime などのコマンド実行

MCP 対応

hop は MCP サーバーとして動作し、接続検索、コマンド実行、状態確認の機能を AI アシスタントに公開します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

README の画像

hop

長い SSH コマンドを入力するのはやめましょう。hop prod を実行するだけで接続できます。

hop の TUI ダッシュボード

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 から接続を直接起動できます。あいまい検索、タグ、環境をすぐに利用できます。

Raycast Store からインストール

README の画像 README の画像 README の画像

設定

設定ファイルの場所:~/.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新しい接続を追加
iSSH 設定からインポート
pSSH 文字列を貼り付け(クイック追加)
e選択した項目を編集
c選択した項目を複製(入力済みのコピーを開く)
d選択した項目を削除
x接続を YAML にエクスポート
ySSH コマンドをコピー
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で元に戻します。

ファミリーダークライト
組み込みのhopdefault-darkdefault-light
Everforesteverforest-darkeverforest-light
Gruvboxgruvbox-darkgruvbox-light
Catppuccincatppuccin-mochacatppuccin-latte
Tokyo Nighttokyo-night-stormtokyo-night-day
Solarizedsolarized-darksolarized-light
Nordnordnord-light
Draculadraculaalucard

プリセットを選ぶと、設定ファイルに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つ以上の接続に解決されるターゲットを指定できます。ターゲットは次の順序で照合されます。

  1. 名前付きグループ — 設定ファイルのgroups:で定義した、接続IDの明示的なリスト
  2. プロジェクト・環境パターン — projectフィールドとenvフィールドで接続を照合します(例:myapp-prodはproject: myappかつenv: prodのすべての接続に一致します)
  3. グロブパターン — 接続IDに対するワイルドカード照合(例:web*、*-prod-*)
  4. ファジーマッチ — 最後に、単一の接続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を通じてコマンドを実行します。

hopのMCPサーバーを通じてサーバーを管理するClaude Code

セットアップ

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_commandSSH コマンド文字列全体を生成します

リモートコマンドの実行を有効にするには、--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 を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。