{"name":"io.github.cygnussystems/cygnus-ssh-mcp","slug":"cygnussystems-cygnus-ssh-mcp","title":null,"description":"SSH-based MCP control of remote Linux, macOS, and Windows servers -- 46 purpose-built tools.","url":"https://mcp.market/server/cygnussystems-cygnus-ssh-mcp","rating":null,"grade":"A","score":88,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":25,"stars":5,"forks":1,"downloads_week":38,"last_push_at":"2026-07-21T19:31:37.000Z","license":"GPL-3.0"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/cygnussystems/cygnus-ssh-mcp","website":null,"version":"1.5.1","remotes":[],"packages":[{"registryType":"pypi","identifier":"cygnus-ssh-mcp","version":"1.5.1","transport":{"type":"stdio"}}],"tools":[{"name":"list_tools","description":"Retrieves a list of all available tools on this MCP server, along with their descriptions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_archive_create","description":"Create a compressed archive from a directory.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_archive_extract","description":"Extract 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_cmd_check_status","description":"Wait 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_cmd_clear_history","description":"Clear the command history for the current SSH connection.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_cmd_history","description":"Retrieve command execution history with optional output snippets.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_cmd_kill","description":"Terminate a currently running command by its handle ID (the `id` field from ssh_cmd_run's response).","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_cmd_output","description":"Retrieve 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_cmd_run","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_conn_add_host","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_conn_connect","description":"Establish an SSH connection using a pre-configured host. The host can be specified by its 'user@hostname' key or by its alias.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_conn_host_info","description":"Get detailed SSH connection status and system information.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_conn_is_connected","description":"Check if there is an active SSH connection.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_conn_status","description":"Get essential SSH connection status information.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_conn_verify_sudo","description":"Check 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_dir_batch_delete_files","description":"Recursively 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_dir_calc_size","description":"Calculate the total size of a directory recursively (sum of all file sizes under it).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_dir_copy","description":"Copy a directory recursively (remote-to-remote; for local<->remote use ssh_dir_transfer instead).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_dir_delete","description":"Delete 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`.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_dir_list_advanced","description":"List 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_dir_list_files_basic","description":"List 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_dir_mkdir","description":"Create a directory on the remote system.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_dir_remove","description":"Remove 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_dir_search_files_content","description":"Recursively 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_dir_search_glob","description":"Recursively 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_dir_transfer","description":"Transfer directories between local and remote systems.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_file_copy","description":"Copy a file on the remote host (source and destination are both remote paths - for local<->remote transfers use ssh_file_transfer instead).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_file_delete_line_by_content","description":"Delete 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(","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_file_find_lines_with_pattern","description":"Search 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_file_get_context_around_line","description":"Get 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_file_insert_lines_after_match","description":"Insert 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_file_move","description":"Move or rename a file or directory (works for both - whichever `source` is).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_file_read","description":"Read file contents directly via SFTP.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_file_replace_line","description":"Replace 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_file_replace_line_multi","description":"Replace 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_file_stat","description":"Get status information about a file or directory (via SFTP stat - works the same way on all platforms, no shell command involved).","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_file_transfer","description":"Transfer 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_file_write","description":"Create 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_host_disconnect","description":"Disconnect the current SSH connection if one exists.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_host_list","description":"List 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_host_remove","description":"Remove 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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_host_update","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_host_use_config","description":"Switch 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_task_kill","description":"Terminate a background task (launched via ssh_task_launch, or any other real remote PID) by sending a signal to its PID.","write_action":true,"price_micros":0,"input_schema":null},{"name":"ssh_task_launch","description":"Launch a command in the background and return its PID immediately, without waiting for it to complete.","write_action":false,"price_micros":0,"input_schema":null},{"name":"ssh_task_status","description":"Check 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.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":88,"grade":"A","scanned_at":"2026-09-25T17:21:52.990Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T17:21:52.969Z","components":{"code":{"score":25,"max":25,"notes":["15 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":12,"max":15,"notes":["last push 66 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"cygnus-ssh-mcp","version":"1.5.1","found":true,"weeklyDownloads":38,"license":"GPL-3.0-or-later","dependencyCount":7,"publishedAt":"2026-07-21T19:32:10.527214Z","repositoryUrl":"https://github.com/cygnussystems/cygnus-ssh-mcp"}],"repo":{"found":true,"owner":"cygnussystems","repo":"cygnus-ssh-mcp","archived":false,"pushedAt":"2026-07-21T19:31:37Z","stars":5,"forks":1,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/118726944?v=4","ownerCreatedAt":"2022-11-21T09:49:37Z","license":"GPL-3.0"},"icon":{"url":null,"source":"none"},"presence":{"stars":5,"forks":1,"downloadsWeek":38,"license":"GPL-3.0","lastPushAt":"2026-07-21T19:31:37.000Z","score":25}}}},"grade_history":[],"reviews":[]}