Cygnus SSH MCP server
io.github.cygnussystems/cygnus-ssh-mcp·v1.5.1·5 starsSSH-based MCP control of remote Linux, macOS, and Windows servers -- 46 purpose-built tools.
5 stars38 downloads/wk
Reviews
Write oneNobody has reviewed Cygnus SSH yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Cygnus SSH tools (46, 15 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
list_toolsRetrieves a list of all available tools on this MCP server, along with their descriptions.
ssh_archive_createwrite actionCreate a compressed archive from a directory.
ssh_archive_extractExtract an archive to a directory. The accepted format is platform-specific and determined purely by `archive_path`'s file extension (not by inspecting the archive's actual content): - Linux/macOS: `.tar.gz`, `.tgz`, or `.tar` only. A `.zip` file (e.g. created by ssh_archive_create on Windows) will fail here with an unsupported-format error. - Windows: `.zip` only. A `.tar`/`.tar.gz` file (e.g. cr
ssh_cmd_check_statusWait for the specified duration, then check the status of a command started with ssh_cmd_run. Call this repeatedly - it's designed to be polled - after ssh_cmd_run returns status='io_timeout' or 'wait_timeout' (the remote command is still genuinely running in both cases - background monitoring keeps collecting its output/exit code), until you get a TERMINAL status below. Do not rerun the original
ssh_cmd_clear_historyClear the command history for the current SSH connection.
ssh_cmd_historyRetrieve command execution history with optional output snippets.
ssh_cmd_killwrite actionTerminate a currently running command by its handle ID (the `id` field from ssh_cmd_run's response).
ssh_cmd_outputRetrieve captured output from a command started with ssh_cmd_run, identified by its handle_id. Useful after an io_timeout/wait_timeout to see progress so far - including output produced after that call returned, since background monitoring keeps collecting it - or any time to re-inspect an earlier command's output without rerunning it.
ssh_cmd_runwrite actionssh_conn_add_hostssh_conn_connectEstablish an SSH connection using a pre-configured host. The host can be specified by its 'user@hostname' key or by its alias.
ssh_conn_host_infoGet detailed SSH connection status and system information.
ssh_conn_is_connectedCheck if there is an active SSH connection.
ssh_conn_statusGet essential SSH connection status information.
ssh_conn_verify_sudoCheck whether elevated access is available on the remote system, without running any privileged command. Call this before using `use_sudo=True` on other tools if you're not sure elevation will succeed.
ssh_dir_batch_delete_fileswrite actionRecursively find and delete files matching a filename glob pattern (same pattern syntax as ssh_dir_search_glob, e.g. `*.tmp`) under a directory. `dry_run` DEFAULTS TO `True` - calling this with no arguments other than `path`/`pattern` only PREVIEWS which files would be deleted and deletes NOTHING; you must explicitly pass `dry_run=False` to actually delete.
ssh_dir_calc_sizeCalculate the total size of a directory recursively (sum of all file sizes under it).
ssh_dir_copyCopy a directory recursively (remote-to-remote; for local<->remote use ssh_dir_transfer instead).
ssh_dir_deletewrite actionDelete a directory and all its contents recursively. `dry_run` DEFAULTS TO `True` - calling this with no arguments other than `path` only PREVIEWS what would be deleted and deletes NOTHING; you must explicitly pass `dry_run=False` to actually delete. Refuses to delete a small set of critical paths outright (root, home directory, `C:\Windows`, `C:\Users`, etc.) regardless of `dry_run`.
ssh_dir_list_advancedList contents of a directory recursively with full metadata (size, permissions, ownership, modification time) - use this instead of ssh_dir_list_files_basic (which only returns bare filenames, non-recursive) when you need more than just names, or ssh_dir_search_glob when you only need to filter by filename pattern without full metadata (that tool is also faster for large trees).
ssh_dir_list_files_basicList the immediate contents of a directory (via SFTP - not recursive, no metadata). For recursive listing with size/permissions/type/etc., or to filter by filename pattern, use ssh_dir_list_advanced or ssh_dir_search_glob instead.
ssh_dir_mkdirwrite actionCreate a directory on the remote system.
ssh_dir_removewrite actionRemove a directory on the remote system - this is the simple `rmdir`/`Remove-Item` equivalent. There is NO dry-run/preview mode here (unlike ssh_dir_delete below) - it acts immediately. If `recursive=False` (default) and the directory is not empty, this RAISES an exception rather than returning an error dict - it does not partially delete anything.
ssh_dir_search_files_contentRecursively search file CONTENTS for a pattern under a directory (unlike ssh_dir_search_glob/ssh_file_find_lines_with_pattern, which match filenames or search within a single already-known file respectively).
ssh_dir_search_globRecursively search for files (or directories, with `include_dirs=True`) matching a filename glob pattern (e.g. `*.log`) - matches by NAME only, not content; use ssh_dir_search_files_content instead to search inside files. For metadata beyond just path/type (size, mtime, permissions), use ssh_dir_list_advanced instead.
ssh_dir_transferwrite actionTransfer directories between local and remote systems.
ssh_file_copyCopy a file on the remote host (source and destination are both remote paths - for local<->remote transfers use ssh_file_transfer instead).
ssh_file_delete_line_by_contentwrite actionDelete a line by its exact content. `match_line` must match EXACTLY ONE line in the file (whitespace-trimmed, literal text - not a pattern); if it matches zero lines or more than one, the operation fails with a descriptive error rather than guessing which line(s) to delete. Use ssh_file_find_lines_with_pattern first if you're not sure the line is unique. (Equivalent to ssh_file_replace_line_multi(
ssh_file_find_lines_with_patternSearch for a pattern in a remote file and return matching lines with their line numbers. Use this to find WHERE a pattern occurs before using ssh_file_get_context_around_line to see surrounding lines, or ssh_file_replace_line/ssh_file_delete_line_by_content to edit (those require an exact, unique line match - this tool helps you find that exact line first).
ssh_file_get_context_around_lineGet lines before and after a line, to see it in context before editing. Like the line-editing tools (ssh_file_replace_line and siblings), `match_line` must match exactly one line in the file (whitespace-trimmed, literal text, not a pattern) - use ssh_file_find_lines_with_pattern first if you're not sure the line is unique.
ssh_file_insert_lines_after_matchwrite actionInsert one or more new lines immediately after a matching line. `match_line` must match EXACTLY ONE line in the file (whitespace-trimmed, literal text - not a pattern); if it matches zero lines or more than one, the operation fails with a descriptive error rather than guessing. Use ssh_file_find_lines_with_pattern first if you're not sure the line is unique.
ssh_file_moveMove or rename a file or directory (works for both - whichever `source` is).
ssh_file_readRead file contents directly via SFTP.
ssh_file_replace_lineReplace a line in a file with a new line. `match_line` must match EXACTLY ONE line in the file (whitespace-trimmed, literal text - not a pattern); if it matches zero lines or more than one, the operation fails with a descriptive error rather than guessing which line you meant. Use ssh_file_find_lines_with_pattern first if you're not sure the line is unique.
ssh_file_replace_line_multiReplace a line in a file with one or more new lines (or delete it, with an empty list). Use this instead of ssh_file_replace_line when you need to insert more than one line, or delete a line without using the separate ssh_file_delete_line_by_content tool.
ssh_file_statGet status information about a file or directory (via SFTP stat - works the same way on all platforms, no shell command involved).
ssh_file_transferwrite actionTransfer a single FILE between the local machine (running this MCP server) and the remote host, via SFTP. Both `local_path` and `remote_path` must be file paths, not directories - for whole-directory transfers, use ssh_dir_transfer instead. For remote-to-remote copies (no local machine involved), use ssh_file_copy instead.
ssh_file_writewrite actionCreate a new file, or overwrite/append to an existing one, with the given content (works the same whether or not the file already exists - `append=True` on a nonexistent file just creates it). Handles special characters and multi-line content properly.
ssh_host_disconnectDisconnect the current SSH connection if one exists.
ssh_host_listList all configured SSH hosts with their aliases and descriptions. This is the ONLY correct way to see what hosts are configured - never read the host configuration TOML file directly (ssh_conn_add_host's docstring names its path). That file stores every host's password, sudo password, and key passphrase in plaintext; this tool deliberately omits all of that and returns only the fields below. If y
ssh_host_removewrite actionRemove a host configuration from the host configuration TOML file (see ssh_conn_add_host's docstring for its exact path and why you should never read it directly - use ssh_host_list to see what's configured instead).
ssh_host_updatewrite actionssh_host_use_configSwitch which host configuration file ssh_host_list, ssh_conn_connect, ssh_conn_add_host, ssh_host_update, and ssh_host_remove all operate against, for the rest of this session (or until you call this again) - not just for one call. This is the same "one active thing at a time" model ssh_conn_connect uses for SSH connections, applied to host configuration files instead; the two are completely indep
ssh_task_killwrite actionTerminate a background task (launched via ssh_task_launch, or any other real remote PID) by sending a signal to its PID.
ssh_task_launchLaunch a command in the background and return its PID immediately, without waiting for it to complete.
ssh_task_statusCheck the liveness of a background task by PID (from ssh_task_launch, or any other real remote PID - e.g. the `pid` field from ssh_cmd_run). This does a live check on the remote host every call, not a cached lookup, so it's safe to call repeatedly.
Public scan report
scanner v0.1.9 · 2026-09-25 · same rubric, same numbers if you re-run it
- Code scan15 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 66 days ago12/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How Cygnus SSH compares
Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 88/100
- higher than 75% of 48,255 servers
- Tools
- 46
- the typical server has 7
- Tools that change things
- 33%
- typical: 0%. Fewer write tools means less an agent can break
- GitHub stars
- 5
- more than 83% of 28,688 servers
- Downloads a week
- 38
- more than 29% of 12,191 servers with a package
What its tools let an agent do: 31 read · 15 change
Install Cygnus SSH in Claude Code, Cursor or VS Code
claude mcp add cygnus-ssh-mcp -- uvx cygnus-ssh-mcp
What the publisher says
From the Cygnus SSH repository's README, as published. We do not edit it. Read it on GitHub
<!-- mcp-name: io.github.cygnussystems/cygnus-ssh-mcp -->
cygnus-ssh-mcp
Cross-platform SSH MCP server with 46 purpose-built tools for real server management by AI agents
Give Claude, OpenCode, or any MCP-compatible AI assistant full control of your Linux, macOS, and Windows servers with 46 specialized tools
Prerequisites · Installation · Quick Start · Features · Documentation
[!TIP]
A note from the author: I've been running this daily since April 2025 — over a
year now — to manage a dozen+ machines and devices, plus a Proxmox host running
30+ containers, across a network tied together with Tailscale. It started as a
tool to solve my own problem, and it's saved me a huge amount of manual work ever
since. After a year of running it against Linux, I've since added support for
Windows, macOS, and other devices with reduced shells like BusyBox. I'm
open-sourcing it now because I think anyone running real infrastructure will find
it just as useful. This is a young public repo, but the tool behind it isn't new
or unproven — it's been battle-tested against my own servers for over a year.
If you find it useful, a ⭐ star or a mention to someone who manages their own
infrastructure goes a long way for a project this new — thank you!
Why cygnus-ssh-mcp?
cygnus-ssh-mcp is an MCP server - usable from Claude Desktop, Claude Code, OpenCode, or any other MCP-compatible client - that connects your AI assistant directly to your remote servers over SSH, exposing 46 purpose-built tools instead of one generic command-runner. It turns natural-language requests into real systems administration - connecting by alias, editing files, managing background processes, handling sudo - across Linux, macOS, and Windows targets alike.
Doing that properly means solving a pile of genuinely hard, per-platform problems that a naive ssh wrapper never has to face - and that this project hit and fixed the hard way, including:
- Getting a real PID back from a Windows target, instead of a meaningless local channel number
- Recovering the actual exit code when Win32-OpenSSH silently flattens it to 1
- Reading file contents via SFTP instead of Get-Content, because PowerShell's console encodes stdout in its OEM code page and corrupts anything non-ASCII
- Killing a sudo'd background process without leaving its privileged child orphaned or blindly firing SIGKILL at the wrong PID
None of this shows up until you actually run these tools against real Linux, macOS, and Windows targets under real conditions - which is exactly how every one of these was found and fixed here, not guessed at from documentation.
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Cygnus SSH: common questions
- Is Cygnus SSH MCP server safe?
- Yes, by our scan: it is graded A (88/100). Read the Cygnus SSH safety report
- How do I install Cygnus SSH?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Cygnus SSH need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is Cygnus SSH maintained?
- The last commit was 106 days ago (2026-07-21). The latest release is v1.5.1.
- What can I use instead of Cygnus SSH?
- Servers from other publishers that do the same job: SSH — policy-gated remote access MCP server.
- How does Cygnus SSH compare with other MCP servers?
- safety score 88/100 (higher than 75% of 48,255 servers); tools 46 (the typical server has 7); tools that change things 33% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to Cygnus SSH
Same job from other publishers: the closest match first, then the best rated.
- SSH — policy-gated remote accessPolicy-gated, audited SSH for Linux and Windows hosts: roles, approvals, and an audit log.not reviewedEstablishedB