ssh-mcp について
ssh-mcpは、AIエージェントにSSH接続先へのアクセスを許可するチーム向けの集中型MCPゲートウェイです。単一のStreamable HTTPサービスで認可、レート制限、コネクションプール、監査ログを管理します。
主な機能
- 01クライアント別・ネットワーク別のコマンドポリシー
- 02SSHコマンド実行と接続確認
- 03単一ファイルのSFTP転送
- 04レート制限とコネクションプール
- 05構造化された監査ログ
活用シーン
- 01複数のAIエージェントのSSHアクセス管理
- 02クライアントやネットワーク別のコマンド制限
- 03コマンドと認可の履歴確認
MCP 対応
Streamable HTTP経由で、接続先一覧、コマンド実行、接続確認、ファイル転送など6種類のSSH・SFTPツールを提供します。MCPクライアントは `/mcp` に接続し、APIキーで認証します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e CONFIG_DIR -e LOG_DIR -e CONFIG_API_ENABLED -e CONFIG_API_TOKEN ghcr.io/gelse/ssh-mcp:0.3.0CONFIG_DIRDirectory containing ssh-mcp-config.jsonLOG_DIRDirectory for JSONL audit logsCONFIG_API_ENABLEDEnable the configuration REST API and web dashboardCONFIG_API_TOKENシークレットBearer token for the configuration APIローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/gelse/ssh-mcp:0.3.0Streamable HTTPツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ssh-mcp
Streamable HTTP を介して AI エージェントに制御された SSH アクセスを提供する、集中型 MCP ゲートウェイです。
どのような問題を解決しますか?
ほとんどの MCP SSH サーバーは、ローカルの stdio プロセスとして動作します。クライアントごとにプロセスが必要で、状態の共有、集中型の認可、監査証跡はありません。複数の AI エージェントが SSH アクセスを必要とする場合、各エージェントが独自の SSH キーを管理し、それぞれ独自のプロセスを実行します。その結果、次の問題が生じます。
- 集中型のアクセス制御がない — 各クライアントが実行可能な内容を決定します
- 監査証跡がない — コマンドが運用チームから見えません
- SSH キーの乱立 — エージェントの各マシンにキーが分散します
- レート制限がない — 暴走したエージェントがターゲットに過剰な負荷をかける可能性があります
ssh-mcp は、単一の HTTP ゲートウェイをデプロイすることでこれらの問題を解決します。すべてのクライアントがゲートウェイに接続し、ゲートウェイが SSH ターゲットに接続します。認可、レート制限、接続プーリング、監査ログを一元管理できます。
クイックスタート
ビルド済みイメージを使用する(推奨)
docker compose pull
docker compose up -d
イメージは ghcr.io/gelse/ssh-mcp:latest で公開されています。
compose ファイルはホストのポート 9080 をコンテナのポート 8080 に割り当てます。
サーバーが実行中であることを確認します。
curl http://localhost:9080/health
# → {"status": "ok"}
config/ssh-mcp-config.json に最小限の設定を作成します。
{
"version": 1,
"ssh_targets": {
"my-server": {
"host": "10.0.1.10",
"username": "deploy"
}
},
"allowed_commands": {
"default": [
{
"targets": ["*"],
"commands": ["hostname", "uptime", "free", "df"]
}
]
}
}
API キーのハッシュを生成し、設定ファイルまたは
secrets.json に追加します(設定を参照)。
代わりにローカルでビルドする
make build
docker compose up -d --build
できること(ツール)
Streamable HTTP 経由で、6 つの MCP ツールを利用できます。
| ツール | 説明 |
|---|---|
ssh_list_servers | 設定済みの SSH ターゲットを一覧表示します |
ssh_list_allowed_commands | ターゲットで許可されているコマンドを表示します |
ssh_execute_command | リモートサーバーでコマンドを実行します |
ssh_check_connection | ターゲットへの SSH 接続をテストします |
ssh_download_file | SFTP 経由でファイルをダウンロードします |
ssh_upload_file | SFTP 経由でファイルをアップロードします |
ツールの命名規則
すべてのツールは ssh_<verb>_<noun> の形式に従います。
ssh_list_servers— リソースを一覧表示しますssh_list_allowed_commands— 権限を一覧表示しますssh_execute_command— 操作を実行しますssh_check_connection— 接続を確認しますssh_download_file/ssh_upload_file— ファイルを転送します
curl コマンドや Python クライアントのコードを含む使用例については、examples/README.md を参照してください。
設定可能な項目
ssh-mcp は、ホットリロードに対応した JSON ファイルで設定します (15 秒間隔でポーリング、デバウンス 2 秒)。主な設定項目は次のとおりです。
| 項目 | 詳細 |
|---|---|
| SSH ターゲット | ホスト、ポート、ユーザー名、キー、パスワード |
| コマンドポリシー | ブロックパターン、キー/ネットワークごとの許可リスト |
| 接続プール | 最大接続数、アイドルタイムアウト、同時実行数 |
| レート制限 | IP ごとのスライディングウィンドウ(デフォルトは 60 リクエスト/分) |
| ログ記録 | ローテーション、gzip、複数の出力先に対応した JSONL |
| SFTP | サンドボックスのルート、パス長の制限 |
詳細なリファレンス:docs/CONFIGURATION.md
| ファイル | 用途 |
|---|---|
ssh-mcp-config.json | メイン設定 |
config.schema.json | 検証用 JSON Schema |
secrets.json | パスワードと API キーのハッシュ |
MCP_SSH_* env vars | あらゆる設定の上書き |
素の SSH や他の MCP サーバーではなく、なぜこれを使うのですか?
ssh-mcp は、すべてのクライアントリクエストとすべての SSH コマンドの間に、9 層からなる順序付きの認可チェーンを設けます。API キーごと、ネットワークごとにルールを設定できるため、基盤となる SSH アカウントに手を加えることなく、異なるエージェントに異なるサーバー上で異なる権限を付与できます。
追加の保護機能:
- サーキットブレーカーにより、障害が発生したターゲットを指数バックオフで隔離します
- レート制限により、制御不能になったエージェントがホストに過剰な負荷をかけるのを防ぎます
- 構造化監査ログにより、すべてのコマンド、クライアント、IP、認可の判断を追跡できます
- コネクションプーリングにより、リクエスト間で SSH セッションを再利用します
- 入力のサニタイズと危険なパターンの検出により、シェルインジェクションの試みをブロックします
アーキテクチャ:ARCHITECTURE.md
セキュリティモデル:docs/SECURITY.md
これは何ではないか
- 対話型シェルではありません — コマンドは個別に実行され、構造化された出力が返されます
- ファイルマネージャーではありません — SFTP がサポートするのは単一ファイルのダウンロードとアップロードのみです(ディレクトリ一覧表示や再帰転送はできません)
- ファイアウォール/ネットワーク ACL ではありません — 認可はコマンドレベルで行われ、ネットワークレベルではありません
- SSH アカウントの権限を縮小するものではありません — コマンドが許可されている場合、SSH ユーザーはそのアカウントが持つ権限で実行します
未対応/既知の制限事項
貢献によって修正可能:
- SFTP は単一ファイルのみです — ディレクトリ一覧表示や再帰転送はできません
- TLS 終端機能はありません — 前段に Traefik または nginx を配置してください
- OAuth や mTLS によるアプリケーション層認証はありません
- レートリミッターの設定はホットリロードできません(起動時に設定します)
アーキテクチャ上の制限:
- Config API ダッシュボードのログインセッションはメモリ内のみです — 再起動後は保持されず、API は単一インスタンスで動作します(設定の変更自体は通常どおり設定ファイルに保持されます)
- 監査ログの改ざん防止機能はありません
オブザーバビリティ
- ヘルス:
GET /health—{"status": "ok"}を返します - メトリクス:
GET /metrics— Prometheus のエクスポジション形式 - ロギング: リクエスト相関情報を含む構造化 JSONL
完全なリファレンス:docs/OBSERVABILITY.md
Config API とダッシュボード
JSON ファイルを編集せずに設定を管理できる、オプションのウェブダッシュボードです。CONFIG_API_ENABLED=true で有効にします。
完全なリファレンス:docs/CONFIG-API.md
よくある質問
HTTP 経由でダッシュボードにアクセスすると 401 が返る
セッション Cookie はデフォルトで Secure(HTTPS のみ)に設定されています。ローカルで HTTP を使ってテストする場合は、次のように設定してください:
environment:
- CONFIG_API_SESSION_COOKIE_SECURE=false
その後、コンテナを再起動してください。
MCP クライアントはどのように接続しますか?
Streamable HTTP トランスポートを使用して http://host:9080/mcp に接続します。API キーは X-API-Key または Authorization: Bearer ヘッダーで渡してください。
API キーのハッシュはどのように生成しますか?
docker compose exec mcp-ssh python -c \
"from lib.crypto import hash_api_key; print(hash_api_key('your-key'))"
# → pbkdf2:sha256:100000$<salt>$<hash>
または、Config API ダッシュボードのハッシュユーティリティを使用してください。
ホットリロードはどのように動作しますか?
設定ファイルは 15 秒ごとにポーリングされ、2 秒のデバウンスが適用されます。ターゲット、コマンド、設定の変更は再起動せずに反映されます。レートリミッターとログ出力先の設定を変更するには再起動が必要です。
コマンドが拒否されたのはなぜですか?
コマンドは 9 層の認可チェーンを通じて評価されます。ログの matched_via フィールドに、どの層で拒否されたかが表示されます。チェーンの全容については、セキュリティモデルを参照してください。
レート制限はどのように動作しますか?
IP ごとのスライディングウィンドウ方式で、デフォルトは 60 秒間に 60 リクエストです。制限を超えると HTTP 503 が返されます。設定ファイルの settings.rate_limit で設定してください。
ログはどこに出力されますか?
ログは /logs ボリューム(./logs からマッピング)に書き込まれます。アクティブなログファイルは ssh-mcp.log で、JSONL 形式です。オプションで gzip ローテーションを設定できます。
基本的なトラブルシューティング
# Check server health
curl http://localhost:9080/health
# Validate config
make config-test
# Check logs
docker compose logs mcp-ssh
ドキュメント
| ドキュメント | 説明 |
|---|---|
ARCHITECTURE.md | システム設計とデータフロー |
docs/SECURITY.md | セキュリティモデルと脅威分析 |
docs/CONFIGURATION.md | 設定の完全なリファレンス |
docs/CONFIG-API.md | 設定 API とダッシュボード |
docs/OBSERVABILITY.md | ヘルス、メトリクス、ロギング |
CONTRIBUTING.md | 開発とコントリビューションガイド |
CHANGELOG.md | リリース履歴 |
examples/ | 設定例とクライアントコード |
開発
# Unit tests
make test
# Integration tests (builds Docker image)
make integrationtest
開発ガイド、コーディング規約、PR ワークフローの詳細については、
CONTRIBUTING.md をご覧ください。
ロードマップ
公開ロードマップはありません。現在の制限と改善の機会については、 未対応事項/既知の課題をご覧ください。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。