ssh-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SSH_MCP_CONFIG | No | Custom path to the servers.toml configuration file. If not provided, the server defaults to ~/.config/ssh-mcp/servers.toml. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_serversA | List all configured SSH servers with their groups and descriptions. Args: group: Optional group name to filter by. Shows all servers if omitted. Use list_groups to see available group names. Returns:
Formatted table of servers with name, groups, and description. An
unknown |
| list_groupsB | List all server groups with descriptions and member counts. Returns: Formatted table of groups with name, description, and server count. |
| executeA | Execute a shell command on a single SSH server. Args:
server: Server name (e.g. 'web-prod-01'). Must match a configured server.
Use list_servers to see available servers.
command: Shell command to execute on the remote server (exactly as it
would be typed at a bash prompt). Rejected if it exceeds
Returns:
Formatted command execution result with stdout, stderr, and exit code.
Long output is truncated at |
| execute_on_groupA | Execute a shell command on all servers in a group in parallel. Concurrency is capped by the Args:
group: Group name (e.g. 'production', 'web'). Use list_groups to see
available groups.
command: Shell command to execute on every server in the group.
Rejected if it exceeds Returns: Formatted summary showing per-server results, success/failure counts, and aggregate exit status. |
| upload_fileA | Upload a file to a remote server via SFTP. Files larger than 100 MiB are refused outright — use rsync or scp for those. Args:
server: Server name (e.g. 'pro-dicentra').
local_path: Path to the local file, RELATIVE to the configured
Returns: Confirmation message with file size. |
| download_fileA | Download a file from a remote server via SFTP. Args:
server: Server name (e.g. 'pro-dicentra').
remote_path: Path to the remote file — normally absolute, though a
relative path is not rejected, just resolved by the remote SFTP
server against the SSH login directory. Must be a regular file —
symlinks, devices, FIFOs, and other non-regular remote
files are refused. Rejected if it contains Returns: Confirmation message with file size. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 6 tools
Every tool has a clearly distinct purpose: execute targets one host, execute_on_group targets a fleet, list_servers/list_groups cover inventory, and upload_file/download_file cover file transfer. The only superficially similar pair, execute and execute_on_group, is explicitly differentiated by scope and arguments.
Most tools follow a verb_noun snake_case pattern (list_servers, upload_file, download_file), but execute is a bare verb and execute_on_group uses a prepositional modifier. The naming is still predictable and readable despite these minor deviations.
Six tools is well-scoped for an SSH MCP server: single-host execution, group execution, server/group discovery, and bidirectional file transfer. Nothing feels redundant or missing enough to warrant a lower score.
Core SSH workflows are covered: inventory, single-host and group command execution, and upload/download. The main gap is that there is no group-level file transfer counterpart to execute_on_group, but agents can work around it by looping over servers.