プロトタイプ · プレビュー版:公式レジストリのすべてのサーバーを掲載し、30分ごとに同期しています。レビューとアカウント機能は今後のステップで始まります。
PopNx MCPAIを使う人のためのMCPサーバー · やさしい言葉で解説

MCP SSH Gateway

作者:d00musバージョン 7.0.0i★ –iパソコンで動く
レジストリ名io.github.d00mus/mcp-ssh-gateway

インストール

概要

作者による説明(英語の原文)

SSH terminals for AI agents: stateful shells, exit codes the moment a command ends, router CLIs.

PopNx MCPの3つの柱

この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。

できること

このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。

  • 接続方法: パソコンで動く
  • トランスポート: stdio
  • カテゴリ: その他

インストール

使っているAIアプリを選んで、設定をコピーしてください。

インストールの前に

  • 基本チェック:1項目中1項目に合格
  • あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
  • 自分で入力するもの: SSH_SERVERS_CONFIG, SSH_MCP_CACHE_DIR, SSH_READ_ONLY, SSH_COMMAND_BLACKLIST

必要なもの

  • PyPIPythonのuvのインストール(uvxコマンドに必要)

どのアプリを使っていますか?

上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。

Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます

{
  "mcpServers": {
    "ssh-gateway": {
      "command": "uvx",
      "args": [
        "mcp-ssh-gateway"
      ],
      "env": {
        "SSH_SERVERS_CONFIG": "your-value",
        "SSH_MCP_CACHE_DIR": "your-value",
        "SSH_READ_ONLY": "your-value",
        "SSH_COMMAND_BLACKLIST": "your-value"
      }
    }
  }
}

ターミナルでこれを実行します

claude mcp add ssh-gateway --env SSH_SERVERS_CONFIG=your-value --env SSH_MCP_CACHE_DIR=your-value --env SSH_READ_ONLY=your-value --env SSH_COMMAND_BLACKLIST=your-value -- uvx mcp-ssh-gateway

動かす前に、空欄の値を入力してください。

Cursorで開く

または、設定を自分でコピーする

プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます

{
  "mcpServers": {
    "ssh-gateway": {
      "command": "uvx",
      "args": [
        "mcp-ssh-gateway"
      ],
      "env": {
        "SSH_SERVERS_CONFIG": "your-value",
        "SSH_MCP_CACHE_DIR": "your-value",
        "SSH_READ_ONLY": "your-value",
        "SSH_COMMAND_BLACKLIST": "your-value"
      }
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

VS Codeで開く

または、設定を自分でコピーする

プロジェクトの .vscode/mcp.json に貼り付けます

{
  "servers": {
    "ssh-gateway": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "mcp-ssh-gateway"
      ],
      "env": {
        "SSH_SERVERS_CONFIG": "your-value",
        "SSH_MCP_CACHE_DIR": "your-value",
        "SSH_READ_ONLY": "your-value",
        "SSH_COMMAND_BLACKLIST": "your-value"
      }
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。

選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。

自分で入力する値

  • SSH_SERVERS_CONFIG env
    Path to the JSON file with SSH server targets, or an inline JSON string. Overridden by --servers-config.
  • SSH_MCP_CACHE_DIR env
    Where logs and known_hosts are kept. Default: the user cache directory.
  • SSH_READ_ONLY env
    Set to true/1 to force the global read-only guardrail.
  • SSH_COMMAND_BLACKLIST env
    Comma-separated global prohibited command patterns.

この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。

できること

パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。

基本チェックi

誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック

  • ✓ 合格

    作者とリポジトリが一致

    レジストリ名は、リポジトリを所有するGitHubアカウント d00mus で確認済みです

  • … 未チェック

    今もメンテナンスされている

    このリポジトリはまだGitHubから読み取っていません

  • … 未チェック

    ライセンスがある

    このリポジトリはまだGitHubから読み取っていません

  • – 対象外

    エンドポイントが応答する

    これはパソコンで動くため、インターネット上のエンドポイントはありません

  • – 対象外

    OAuthでサインイン

    パソコンで動き、代わりにローカルの設定を使います

  • … 未チェック

    ツールの説明に隠れた指示がない

    パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです

その他のほかのサーバーとの比較i

  • このカテゴリのほかの32709件のうち0%よりスターが多い
  • このカテゴリのほかの32709件のうち51%より最近レジストリに公開
  • 基本チェックの結果が、このカテゴリのほかの32709件のうち100%と同じかそれ以上

レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。

よくある質問

MCP SSH Gatewayは安全ですか?

当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。

どんなキーやコードが必要ですか?

レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。

パソコンで動きますか、それともクラウドですか?

あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。

今もメンテナンスされていますか?

GitHubリポジトリの最終更新は–、最新バージョン(7.0.0)がレジストリに届いたのは39 日前です。

どのアプリで使えますか?

Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにPython (uv)も必要です。

代わりに使えるものは?

同じカテゴリには:Spec Driven Development, Remote Desktop Commander, SwarmMemo

代わりの候補

同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。

カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i

Remote Desktop Commander

作者:desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

クラウドで動く★ 211一昨日更新
インストール

SwarmMemo

作者:Hugo0

Talk with agent swarms: rooms, private messages and paid tasks for AI agents

クラウドで動く今日更新
インストール

作者のREADME

READMEを開く

作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。

MCP SSH Gateway

SSH terminals for AI agents that know when a command is done.

Six tools, real shells that keep their state, the exit code the moment a command ends, and answers a small model can act on. One direct dependency (paramiko), no daemon, nothing in the cloud.

English · Русский

Why this one

  • It knows when a command is done. The shell itself reports the end and the exit code, so echo hi returns in milliseconds, a failing command says exit_code: 2, and a three-minute build answers running after 10 seconds and is collected with read. No sleeps, no guessing from silence.
  • Terminals with state. A session is one real shell: cd, variables and virtualenvs stay between calls. run without a session_id opens a new shell, so nothing is shared by accident.
  • Made for small models. Six tools, about 1.6k tokens of descriptions in total. Every stop says what to do next (hint), pagers are off, a progress bar is one line, a wrong argument gets an answer that names the right call, and long output comes in pages (has_more, tail, offset).
  • Questions do not hang. Continue? [y/N], a password prompt or an unclosed quote returns waiting_input. The agent answers with signal or presses Ctrl+C, and the shell keeps its state.
  • Routers too. A Keenetic router CLI (show interface, --More-- handled) or its Linux shell, through the same tools.
  • Tested against real `sshd`. Containers with bash, BusyBox ash, zsh, dash, fish and tcsh logins and a host without SFTP run in CI on every push.

Quick start

You need uv (or Python 3.11+ and pip) and SSH access to a host you control.

Already have `~/.ssh/config`? Add this to your MCP client, and every host in that file becomes a server (key or agent login):

{

"mcpServers": { "ssh": { "command": "uvx", "args": ["mcp-ssh-gateway", "--import-ssh-config"] } } }

This is the format of Cursor (~/.cursor/mcp.json) and Claude Desktop (claude_desktop_config.json); other clients are below. Restart the client and ask: *"List my SSH servers and show the disk usage on web."*

Want a password login, a router or a read-only host? Write a servers.json:

{

"servers": { "web": {"host": "192.168.1.10", "user": "deploy", "key_path": "~/.ssh/id_ed25519"}, "router": {"host": "192.168.1.1", "user": "admin", "password": "${ROUTER_PASSWORD}"} } }

and point the gateway at it with "args": ["mcp-ssh-gateway", "--servers-config", "/absolute/path/to/servers.json"]. Use an absolute path (clients do not start in your folder; on Windows escape backslashes in JSON) and give the gateway the variables it refers to in the client's "env" block. servers.json.example also shows a read-only production host. Without uv: pip install mcp-ssh-gateway and "command": "mcp-ssh-gateway".

Other clients

Claude Code

claude mcp add ssh --scope user -- uvx mcp-ssh-gateway --import-ssh-config

VS Code (.vscode/mcp.json: the top key is servers)

{

"servers": { "ssh": {"type": "stdio", "command": "uvx", "args": ["mcp-ssh-gateway", "--import-ssh-config"]} } }

Codex (~/.codex/config.toml, or codex mcp add ssh -- uvx mcp-ssh-gateway --import-ssh-config)

[mcp_servers.ssh]

command = "uvx" args = ["mcp-ssh-gateway", "--import-ssh-config"] startup_timeout_sec = 30 # the first uvx run downloads the package

The gateway is also listed in the official MCP Registry as io.github.d00mus/mcp-ssh-gateway, for the clients and directories that read it.

What the agent sees

Answers as a client receives them, captured from the test suite's Debian container (the host address and the disk figures are replaced with example values):

server_list()

→ {"servers":[{"server":"web","host":"192.168.1.10:22","user":"deploy"}]}

run(server="web", command="df -h /") # no session_id: a new shell is opened → {"session_id":"web/1","status":"completed","exit_code":0, "output":"$ df -h /\nFilesystem Size Used Avail Use% Mounted on\n/dev/vda1 40G 31G 7.2G 82% /\n"}

run(session_id="web/1", command="ls /nonexistent") # the same shell; a non-zero code is a result → {"session_id":"web/1","status":"completed","exit_code":2, "output":"$ ls /nonexistent\nls: cannot access '/nonexistent': No such file or directory\n"}

run(session_id="web/1", command="read -p 'Continue? [y/N] ' a; echo got:$a") → {"session_id":"web/1","status":"waiting_input", "output":"$ read -p 'Continue? [y/N] ' a; echo got:$a\nContinue? [y/N] ", "hint":"The program waits for input. Answer with signal action=stdin text=..., or stop it with signal ctrl_c."}

signal(session_id="web/1", action="stdin", text="y") → {"session_id":"web/1","status":"completed","output":"got:y\n","exit_code":0}

run(session_id="web/1", command="seq 1 500", lines=5) # long output comes in pages → {"session_id":"web/1","status":"completed","output":"$ seq 1 500\n1\n2\n3\n4\n","exit_code":0,"has_more":496}

read(session_id="web/1", tail=3) # just the end → {"session_id":"web/1","status":"completed","output":"498\n499\n500\n","exit_code":0,"skipped_lines":493}

read(session_id="web/1", offset=-20, lines=3) # scroll back; the unread position stays put → {"session_id":"web/1","status":"completed","output":"481\n482\n483\n","exit_code":0}

run(session_id="web/1", command="sleep 30", wait=1) → {"session_id":"web/1","status":"running","output":"$ sleep 30\n", "hint":"Still running. Call read(session_id='web/1') again, or stop it with signal ctrl_c."}

signal(session_id="web/1", action="ctrl_c") → {"session_id":"web/1","status":"interrupted","output":"\n","process_stopped":true}

A mistake gets an answer that names the right call. This is what a model that invents a cwd argument for run reads back:

{"error": "run has no argument 'cwd'. It takes: command, server, session_id, shell, wait, timeout, lines. To work in a folder, start the command with 'cd /path && '."}
FieldMeaning
statuscompleted, running, waiting_input, interrupted, timed_out, failed or idle.
exit_codeOnly with completed. Non-zero is a result, not a tool error.
has_moreUnread lines left in the session; read returns them.
hintWhat to do next, whenever the agent would otherwise have to guess.
skipped_linesOlder unread lines that a new command or read(tail=…) passed over. Nothing is lost: read(offset=0) scrolls back to them.
dropped_dataUnread output that is gone for good: the session buffer (the last 4 million characters are kept) overflowed.

Tools

ToolWhat it does
server_listThe servers and their open sessions.
runRuns a command. Returns when it ends, or after wait seconds (default 10) with running. Without session_id it opens a new shell.
readThe next unread lines of a session (waits up to wait for a running command); tail for the end, offset to scroll back.
signalstdin answers a question, ctrl_c stops the command, ctrl_d ends its input.
session_closeCloses a shell. A server allows only a few (max_sessions, default 8).
filelist, read, write and edit remote files over SFTP, or through the shell when the host has no SFTP. Reads can filter (contains, tail_lines); an edit is an exact-text replacement that can be guarded with expected_sha256.
server_addOnly with --allow-add-server: adds a server to servers.json.

Sessions are named server/N. A shell has state (folder, variables), so there is no default one: run without session_id always opens a new shell and returns its id, and that id continues the same shell. Close the shells you are done with.

What it works with

HostStatus
Linux with bash, dash, BusyBox ash or zsh as the login shellWorks. Tested against real sshd containers (Debian, Alpine, zsh and dash logins).
fish or tcsh login shellWorks with "shell": "bash" in servers.json (the gateway runs exec bash after login). Without it the gateway refuses at once and says so.
Keenetic router (NDM CLI, and the Linux shell behind it)Works. Covered by a scripted fake in the tests and used every day on a real router.
Other router CLIs (Cisco IOS, Junos, …)Not yet: #1. A plain vendor CLI may work but is untested.
Hosts behind a bastion (ProxyJump)Not yet: #2. --import-ssh-config ignores ProxyJump.
Windows hosts whose SSH shell is cmd or PowerShellNot supported: the gateway needs a POSIX shell.

The gateway itself runs wherever Python 3.11+ runs (Linux, macOS, Windows).

Security

The agent has the reach of the SSH account you give it. What follows narrows the damage from mistakes; it does not replace a restricted account.

  • Guardrails are mistake guards. read_only and command_blacklist (literal words, case-insensitive) look at the command text. Shell tricks, base64 or python -c get around them. For a real boundary use a restricted SSH account: a read-only shell, ForceCommand, separate credentials per trust level.
  • Local files are off. local_path (upload, download) works only after you start the gateway with --project-root , and then only inside that folder.
  • Host keys: a new host is trusted on first contact and its key is kept in known_hosts in the cache directory; a changed key is refused. verify_host: false turns the check off.
  • Secrets: put ${NAME} references in servers.json instead of the values. Logs mask password-like values (--log-output off writes no logs).
  • No listening port: the gateway talks MCP over stdio only. server_add does not exist unless you start it with --allow-add-server, and it only appends.

The full policy and how to report a problem: SECURITY.md.

Configuration

servers.json fields: host, user, port (22), key_path (~ and ${NAME} work), password and key_passphrase (only ${NAME} references are replaced, the rest is used as written), verify_host (true), description, extra_path (added to PATH), read_only, command_blacklist, max_sessions (8), shell (a POSIX shell to exec after login, for fish or tcsh accounts). The file is re-read while the gateway runs; unchanged servers keep their sessions.

Command line (none is required except a source of servers):

OptionMeaning
--servers-configPath to servers.json, or the JSON itself. Also $SSH_SERVERS_CONFIG; falls back to ./servers.json.
--import-ssh-configAlso offer the hosts of ~/.ssh/config (key or agent login).

| --read-only, --command-blacklist a,b | Guardrails for every server (or $SSH_READ_ONLY,

冒頭だけを表示しています。続きはリポジトリで読めます

PopNxに聞く