ssh-mcp-server
🔐 ssh-mcp-server
MCP (Model Context Protocol) ベースのSSHサーバーであり、MCPプロトコルを介してリモートSSHコマンドを実行できます。
English Document | 中文文档
📝 プロジェクト概要
ssh-mcp-serverは、AIアシスタントやMCPプロトコルをサポートするその他のアプリケーションが、標準化されたインターフェースを通じてリモートSSHコマンドを実行できるようにするブリッジツールです。これにより、AIアシスタントはSSH認証情報をAIモデルに直接公開することなく、安全にリモートサーバーを操作し、コマンドを実行し、結果を取得できるようになります。
WeChatグループへの参加を歓迎します:

✨ 主な機能
🔒 安全な接続: パスワード認証や秘密鍵認証(パスフレーズ対応)など、複数の安全なSSH接続方法をサポート
🛡️ コマンドセキュリティ制御: 柔軟なブラックリストおよびホワイトリストメカニズムにより、許可されるコマンドの範囲を正確に制御し、危険な操作を防止
🔄 標準化されたインターフェース: MCPプロトコル仕様に準拠しており、同プロトコルをサポートするAIアシスタントとシームレスに統合可能
📂 ファイル転送: 双方向のファイル転送をサポートし、ローカルファイルのサーバーへのアップロードや、サーバーからのファイルダウンロードが可能
🔑 認証情報の分離: SSH認証情報は完全にローカルで管理され、AIモデルには一切公開されないため、セキュリティが向上
🚀 すぐに利用可能: グローバルインストール不要でNPXを使用して直接実行できるため、導入が簡単かつ迅速
📦 オープンソースリポジトリ
GitHub: https://github.com/classfang/ssh-mcp-server
NPM: https://www.npmjs.com/package/@fangjunjie/ssh-mcp-server
🛠️ ツール一覧
ツール | 名前 | 説明 |
execute-command | コマンド実行ツール | リモートサーバーでSSHコマンドを実行し、結果を取得 |
upload | ファイルアップロードツール | ローカルファイルをリモートサーバーの指定場所にアップロード |
download | ファイルダウンロードツール | リモートサーバーからローカルの指定場所にファイルをダウンロード |
list-servers | サーバー一覧ツール | 利用可能なすべてのSSHサーバー設定を一覧表示 |
📚 使用方法
🔧 MCP設定例
⚠️ 重要: MCP設定ファイルでは、各コマンドライン引数とその値は
args配列内の個別の要素である必要があります。スペースで結合しないでください。例えば、"--host 192.168.1.1"ではなく"--host", "192.168.1.1"を使用してください。
⚙️ コマンドラインオプション
Options:
--config-file JSON configuration file path (recommended for multiple servers)
--ssh-config-file SSH config file path (default: ~/.ssh/config)
--ssh SSH connection configuration (can be JSON string or legacy format)
-h, --host SSH server host address or alias from SSH config
-p, --port SSH server port
-u, --username SSH username
-w, --password SSH password
-k, --privateKey SSH private key file path
-P, --passphrase Private key passphrase (if any)
-W, --whitelist Command whitelist, comma-separated regular expressions
-B, --blacklist Command blacklist, comma-separated regular expressions
-s, --socksProxy SOCKS proxy server address (e.g., socks://user:password@host:port)
--allowed-local-paths Additional allowed local paths for upload/download, comma-separated
--pty Allocate pseudo-tty for command execution (default: true)
--pre-connect Pre-connect to all configured SSH servers on startup
🔑 パスワードの使用
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456"
]
}
}
}🔐 秘密鍵の使用
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--privateKey", "~/.ssh/id_rsa"
]
}
}
}🔏 パスフレーズ付き秘密鍵の使用
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--privateKey", "~/.ssh/id_rsa",
"--passphrase", "pwd123456"
]
}
}
}📋 ~/.ssh/config の使用
~/.ssh/config ファイルで定義されたホストエイリアスを使用できます。サーバーはSSH設定から接続パラメータを自動的に読み取ります:
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "myserver"
]
}
}
}~/.ssh/config に以下が含まれていると仮定します:
Host myserver
HostName 192.168.1.1
Port 22
User root
IdentityFile ~/.ssh/id_rsaカスタムSSH設定ファイルのパスを指定することも可能です:
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "myserver",
"--ssh-config-file", "/path/to/custom/ssh_config"
]
}
}
}注意: コマンドラインパラメータはSSH設定値よりも優先されます。例えば、--port 2222 を指定すると、SSH設定のポートが上書きされます。
🌐 SOCKSプロキシの使用
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456",
"--socksProxy", "socks://username:password@proxy-host:proxy-port"
]
}
}
}
📝 コマンドのホワイトリストとブラックリストの使用
--whitelist および --blacklist パラメータを使用して、実行可能なコマンドの範囲を制限します。複数のパターンはカンマで区切ります。各パターンは、コマンドを照合するための正規表現です。
例: コマンドホワイトリストの使用
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456",
"--whitelist", "^ls( .*)?,^cat .*,^df.*"
]
}
}
}例: コマンドブラックリストの使用
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456",
"--blacklist", "^rm .*,^shutdown.*,^reboot.*"
]
}
}
}注意: ホワイトリストとブラックリストの両方が指定されている場合、システムはまずコマンドがホワイトリストに含まれているかを確認し、次にブラックリストに含まれているかを確認します。コマンドは両方のチェックを通過する必要があります。
🧩 マルチSSH接続の例
複数のSSH接続を設定するには3つの方法があります:
📄 方法1: 設定ファイルの使用(推奨)
JSON設定ファイルを作成します(例: ssh-config.json):
配列形式:
[
{
"name": "dev",
"host": "1.2.3.4",
"port": 22,
"username": "alice",
"password": "{abc=P100s0}",
"socksProxy": "socks://127.0.0.1:10808"
},
{
"name": "prod",
"host": "5.6.7.8",
"port": 22,
"username": "bob",
"password": "yyy",
"socksProxy": "socks://127.0.0.1:10808"
}
]オブジェクト形式:
{
"dev": {
"host": "1.2.3.4",
"port": 22,
"username": "alice",
"password": "{abc=P100s0}",
"socksProxy": "socks://127.0.0.1:10808"
},
"prod": {
"host": "5.6.7.8",
"port": 22,
"username": "bob",
"password": "yyy",
"socksProxy": "socks://127.0.0.1:10808"
}
}次に --config
次に --config-file` パラメータを使用します:
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--config-file", "ssh-config.json"
]
}
}
}🔧 方法2: --ssh パラメータでJSON形式を使用
JSON形式の設定文字列を直接渡すことができます:
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"@fangjunjie/ssh-mcp-server",
"--ssh", "{\"name\":\"dev\",\"host\":\"1.2.3.4\",\"port\":22,\"username\":\"alice\",\"password\":\"{abc=P100s0}\",\"socksProxy\":\"socks://127.0.0.1:10808\"}",
"--ssh", "{\"name\":\"prod\",\"host\":\"5.6.7.8\",\"port\":22,\"username\":\"bob\",\"password\":\"yyy\",\"socksProxy\":\"socks://127.0.0.1:10808\"}"
]
}
}
}📝 方法3: レガシーなカンマ区切り形式(後方互換性)
パスワードに特殊文字が含まれていない単純なケースでは、レガシー形式を引き続き使用できます:
npx @fangjunjie/ssh-mcp-server \
--ssh "name=dev,host=1.2.3.4,port=22,user=alice,password=xxx" \
--ssh "name=prod,host=5.6.7.8,port=22,user=bob,password=yyy"⚠️ 注意: レガシー形式では、
=、,、{、}などの特殊文字を含むパスワードで問題が発生する可能性があります。特殊文字を含むパスワードには方法1または方法2を使用してください。
MCPツール呼び出しでは、connectionName パラメータを介して接続名を指定します。省略された場合はデフォルトの接続が使用されます。
例('prod' 接続でコマンドを実行):
{
"tool": "execute-command",
"params": {
"cmdString": "ls -al",
"connectionName": "prod"
}
}例(タイムアウトオプション付きでコマンドを実行):
{
"tool": "execute-command",
"params": {
"cmdString": "ping -c 10 127.0.0.1",
"connectionName": "prod",
"timeout": 5000
}
}⏱️ コマンド実行タイムアウト
execute-command ツールは、コマンドが無限にハングアップするのを防ぐためのタイムアウトオプションをサポートしています:
timeout: コマンド実行のタイムアウト時間(ミリ秒単位、オプション、デフォルトは30000ms)
エラーレスポンスには、エージェント側での処理を容易にするために、安定した
code、message、retriableフィールドが含まれます
これは、ping、tail -f、または実行をブロックする可能性のあるその他の長時間実行プロセスなどのコマンドに特に役立ちます。
🗂️ すべてのSSHサーバーを一覧表示
MCPツール list-servers を使用して、利用可能なすべてのSSHサーバー設定を取得できます:
呼び出し例:
{
"tool": "list-servers",
"params": {}
}レスポンス例:
[
{ "name": "dev", "host": "1.2.3.4", "port": 22, "username": "alice" },
{ "name": "prod", "host": "5.6.7.8", "port": 22, "username": "bob" }
]🛡️ セキュリティに関する考慮事項
このサーバーは、リモートサーバー上でコマンドを実行し、ファイルを転送するための強力な機能を提供します。安全に使用するために、以下を考慮してください:
コマンドのホワイトリスト化: 実行可能なコマンドセットを制限するために、
--whitelistオプションを使用することを強く推奨します。ホワイトリストがない場合、リモートサーバー上で任意のコマンドが実行される可能性があり、重大なセキュリティリスクとなる可能性があります。秘密鍵のセキュリティ: サーバーはSSH秘密鍵をメモリに読み込みます。
ssh-mcp-serverを実行するマシンが安全であることを確認してください。信頼できないネットワークにサーバーを公開しないでください。サービス拒否攻撃 (DoS): サーバーにはレート制限が組み込まれていません。攻撃者が接続要求や大量のファイル転送でサーバーをフラッディングし、DoS攻撃を仕掛ける可能性があります。レート制限機能を持つファイアウォールやリバースプロキシの背後でサーバーを実行することを推奨します。
パストラバーサル: サーバーには、ローカルファイルシステムに対するパストラバーサル攻撃に対する保護機能が組み込まれています。ただし、
uploadおよびdownloadコマンドで使用されるパスには引き続き注意を払うことが重要です。ローカル転送の範囲: デフォルトでは、ローカルファイル転送は現在の作業ディレクトリに制限されています。
--allowed-local-pathsまたは設定内のallowedLocalPathsは、明示的に信頼されたディレクトリに対してのみ使用してください。
🌟 Star History
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/classfang/ssh-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server