Fast Mcp Ssh

io.github.klNuno由 GitHub 帳號 klNuno 發布v0.5.1更新於 Oct 24, 2026

SSH, SFTP, PTY shells, host-to-host copies and remote screenshots for AI agents. One Rust binary.

發布方自己的服務:Fastio

概覽

AI 產生的概覽

在本機執行的 Rust MCP 伺服器,讓 AI 助理透過 SSH 操作已設定的主機:執行指令、常駐 PTY 終端、SFTP 檔案、截圖與連接埠轉送。

可以做什麼
  • 在遠端主機執行指令:單次 exec、平行批次、常駐 PTY 終端、中斷
  • 透過 SFTP 管理遠端檔案:列目錄、查屬性、上傳下載、主機間複製、寫入、建目錄、刪除、tail
  • 檢視主機狀態:快取的主機概況、解析後的行程/磁碟/記憶體/網路資訊、systemd 服務
  • 擷取遠端桌面截圖並先縮小再回傳
  • 管理連線與網路:列出主機、ping、中斷連線、重新載入設定、關閉終端、開啟與關閉本機 TCP 轉送
適用情境
適合需要讓助理透過 SSH 操作遠端 Linux 或 macOS 機器的情境,例如執行指令、改檔案、查服務或截圖,且不想依賴 Node 或 Python 執行環境,並希望每次呼叫都有防護規則與稽核日誌。
執行需求
以本機 stdio 程序執行,可用 cargo 或預先編譯的執行檔安裝(Linux 與 macOS 的 x86_64/aarch64、Windows x86_64)。需要 ~/.fast-mcp-ssh/hosts.toml 主機設定、~/.fast-mcp-ssh/keys/ 下的 SSH 金鑰,驗證方式為 key、agent 或 password。需要能連線到目標主機的網路。
安裝前請注意
它提供真實的 SSH 存取權限,助理可在遠端主機執行指令、寫入或刪除檔案;README 說明防護規則只能防誤操作,擋不住控制模型的對手,應限制遠端帳號權限。主機金鑰預設為 TOFU,除非啟用嚴格固定。每次呼叫都會寫入稽核日誌,憑證會被清除。具破壞性的工具以 MCP 註解標示,但是否攔截取決於用戶端。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Fast Mcp Ssh,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

fast-mcp-ssh

SSH, SFTP and persistent shells for AI agents. One Rust binary, no runtime.

[crates.io] [CI] [License] [Rust 1.89+] [Platform]

An MCP server that gives a model real SSH access:

  • One connection per host, held open across calls.
  • A PTY shell that remembers cd and export.
  • SFTP instead of cat > file, and host-to-host copies that skip your disk.
  • A screenshot of the remote desktop.
  • Regex guards before anything leaves your machine.
  • An append-only audit log of every call.

Answers come back as TOON, roughly 40 percent fewer tokens than JSON on tabular data.

Install

bash
cargo install fast-mcp-ssh

Or a prebuilt binary from the latest release, checked against SHA256SUMS.txt. Linux and macOS ship x86_64 and aarch64, Windows x86_64.

Copy hosts.example.toml to ~/.fast-mcp-ssh/hosts.toml and fill in your hosts. Keys go in ~/.fast-mcp-ssh/keys/<name>; auth is key, agent or password.

Wire it up

.mcp.json, or claude_desktop_config.json for Claude Desktop:

json
{  "mcpServers": {    "ssh": {      "type": "stdio",      "command": "fast-mcp-ssh"    }  }}

Same block in Claude Code, Cursor, Windsurf, Zed, VS Code Copilot and anything else that speaks MCP over stdio.

In the MCP registry it is mcp-name: io.github.klNuno/fast-mcp-ssh.

Tools

host is optional on every tool once [defaults] default_host is set.

GroupTools
Runexec exec_batch sh interruptOne-shot, parallel fan-out, persistent PTY, Ctrl-C
Filesls stat dn up cp wr mkdir rm tailSFTP, plus tail -n / tail -F in a bounded window
VisualshotScreenshots the remote desktop, downscaled before it reaches the model
Opsfacts sys svcCached host profile, parsed ps/df/mem/net, systemd units
Sessionhosts ping disconnect disconnect_all reload shellsDiscovery and lifecycle; reload swaps config without a restart, shells closes named PTYs
Networkforward unforward forwardsLocal TCP forwards over the same connection

Every tool carries MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so a client can gate destructive calls.

Host-to-host copy

cp moves a file from one configured host to another. The bytes never land on your disk and never reach the model, and a sha256 is compared on both ends before success. Guards cover the destination too, so a read-only target still refuses the write.

Remote screenshots

shot hands the model an image instead of a wall of text. It uses whichever of grim, gnome-screenshot, spectacle, ImageMagick import or scrot the host has, covering X11 and wlroots Wayland, and downscales locally so a 4K screen is not a multi-megabyte payload.

Protocol

Speaks stateless MCP (2026-07-28) and every revision back to 2024-11-05, picked per peer. Stateless changes three things:

  • Confirmations come back as an input_required result the client answers and retries (SEP-2322), because a server may no longer open a request of its own. Older peers keep elicitation/create.
  • Long calls hand back a task handle to poll (SEP-2663): exec past its 60s timeout, tail with follow=true. Clients without the extension keep the blocking call.
  • tools/list is sorted, so it is byte-identical between restarts, and carries a one hour ttlMs (SEP-2549). A client's prompt cache keeps hitting.

Shells are unaffected. A PTY has always been addressed by the host and session arguments of the call, which is the explicit handle stateless wants.

Security

Guards run before any SSH packet leaves. deny_patterns refuse outright, confirm_patterns ask the user, a client that cannot answer is denied, and read_only = true blocks anything that looks like a write.

Paths are checked on both sides: remote reads of keys, shadow files and cloud credentials, local writes into your ~/.bashrc or an autostart folder. Every path-taking tool runs both checks, tail included, and re-checks once the server has resolved the path, so a symlink cannot launder a blocked target. A path that will not resolve refuses the call.

Host keys are pinned, TOFU by default, strict and per-host fingerprints available. Every call lands in ~/.fast-mcp-ssh/audit.log as NDJSON, with credentials scrubbed.

Guards stop accidents, not an adversary who controls the model. Scope the remote account accordingly. Threat model: SECURITY.md. Version history: CHANGELOG.md.

Benchmark

50 iterations per scenario, same Linux host, same LAN, same SSH key, client on Windows 11. Medians, lower is better, measured on 0.5.0. Reproduce with benchmark/, raw runs in benchmark/results/.

fast-mcp-sshmcp-ssh-managerssh-mcp-server
Cold start48 ms280 ms260 ms
exec echo ok2.2 ms89.7 ms46.7 ms
exec uname -a; whoami; pwd3.6 ms90.9 ms50.6 ms
exec seq 1 5000 (~29 KB)19.6 ms90.4 ms 149.2 ms
Write a 1 KB file1.1 ms89.9 ms47.9 ms
Read a 1 KB file1.7 ms90.3 ms48.9 ms
Tool surface, sent every session26 tools, 21.1 KB37 tools, 39.9 KB4 tools, 1.7 KB

Both alternatives are Node, so ~250 ms of their cold start is the runtime booting. The steady-state gap is the connection: fast-mcp-ssh holds one SSH session per host and opens a channel per call, the other two reconnect. Writes go over SFTP here, through a cat > file heredoc there.

Development

bash
cargo install --path .        # build and install from a clonecargo test                    # unit testscargo clippy --all-targets    # no warnings allowed in CI./scripts/test-sh.ps1         # end-to-end against a real host (Windows)

Never write to stdout outside the MCP transport: a stray println! corrupts the JSON-RPC stream and the client disconnects without an error. tracing macros go to stderr and are safe.

License

MIT.

Footnotes

  1. mcp-ssh-manager truncates that response to 12 KB, so it is not returning the same output. ssh-mcp-server returns raw stdout with no exit code, which is why its replies are the shortest and why a failed command looks like a successful one. ↩

來源:README.md,提交 760b74b

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v0.5.1最新Sep 24, 2026
  2. v0.5.0Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Fast 整合