ssh-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ssh-mcp-serverCheck the current system status and disk usage"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ssh-mcp-server
SSH-based MCP (Model Context Protocol) server that allows remote execution of SSH commands via the MCP protocol.
Project Overview
ssh-mcp-server is a bridging tool that enables AI assistants and other applications supporting the MCP protocol to execute remote SSH commands through a standardized interface. This allows AI assistants to safely operate remote servers, execute commands, and retrieve results without directly exposing SSH credentials to AI models.
Related MCP server: SSH MCP Server
Key Features
Secure Connections: Supports multiple secure SSH connection methods, including password authentication and private key authentication (with passphrase support)
Command Security Control: Precisely control the range of allowed commands through flexible blacklist and whitelist mechanisms to prevent dangerous operations
Standardized Interface: Complies with MCP protocol specifications for seamless integration with AI assistants supporting the protocol
File Transfer: Supports bidirectional file transfers, uploading local files to servers or downloading files from servers
Credential Isolation: SSH credentials are managed entirely locally and never exposed to AI models, enhancing security
Ready to Use: Can be run directly using NPX without global installation, making it convenient and quick to deploy
Environment Variables: Support for credentials via environment variables for secure CI/CD integration
Batch Execution: Execute multiple commands in sequence with a single tool call
Tools List
Tool | Description |
execute-command | Execute SSH commands with optional cwd and sudo support |
execute-batch | Execute multiple commands in sequence with a single call |
read-file | Read file contents from remote server with line range support |
write-file | Write content to files on remote server with append mode |
upload | Upload local files to remote server via SFTP |
download | Download files from remote server via SFTP |
test-connection | Test SSH connectivity and return server info |
get-status | Get comprehensive system status (CPU, memory, disk, OS, processes) |
check-port | Check if ports are open/listening on remote server |
list-servers | List all configured SSH connections |
Usage
MCP Configuration Examples
Important: In MCP configuration files, each command line argument and its value must be separate elements in the
argsarray. Do NOT combine them with spaces. For example, use"--host", "192.168.1.1"instead of"--host 192.168.1.1".
Command Line Options
Options:
-h, --host SSH server host address
-p, --port SSH server port
-u, --username SSH username
-w, --password SSH password
-k, --privateKey SSH private key file path
-P, --passphrase Private key passphrase (if any)
-W, --whitelist Command whitelist, comma-separated regular expressions
-B, --blacklist Command blacklist, comma-separated regular expressions
-s, --socksProxy SOCKS proxy server address (e.g., socks://user:password@host:port)
-t, --timeout Default command timeout in milliseconds (default: 30000)
Environment Variables (alternative to CLI options):
SSH_HOST SSH server host address
SSH_PORT SSH server port (default: 22)
SSH_USERNAME SSH username
SSH_PASSWORD SSH password
SSH_PRIVATE_KEY SSH private key file path
SSH_PASSPHRASE Private key passphrase
SSH_WHITELIST Command whitelist
SSH_BLACKLIST Command blacklist
SSH_SOCKS_PROXY SOCKS proxy server address
SSH_TIMEOUT Default command timeout in millisecondsUsing Password
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456"
]
}
}
}Using Private Key
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--privateKey", "~/.ssh/id_rsa"
]
}
}
}Using Private Key with Passphrase
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--privateKey", "~/.ssh/id_rsa",
"--passphrase", "pwd123456"
]
}
}
}Using SOCKS Proxy
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456",
"--socksProxy", "socks://username:password@proxy-host:proxy-port"
]
}
}
}
Using Command Whitelist and Blacklist
Use the --whitelist and --blacklist parameters to restrict the range of executable commands. Multiple patterns are separated by commas. Each pattern is a regular expression used to match commands.
Example: Using Command Whitelist
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456",
"--whitelist", "^ls( .*)?,^cat .*,^df.*"
]
}
}
}Example: Using Command Blacklist
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": [
"-y",
"ssh-mcp-server",
"--host", "192.168.1.1",
"--port", "22",
"--username", "root",
"--password", "pwd123456",
"--blacklist", "^rm .*,^shutdown.*,^reboot.*"
]
}
}
}Note: If both whitelist and blacklist are specified, the system will first check whether the command is in the whitelist, and then check whether it is in the blacklist. The command must pass both checks to be executed.
Multi-SSH Connection Example
You can specify multiple SSH connections by passing multiple --ssh parameters, each with a unique name:
npx ssh-mcp-server \
--ssh "name=dev,host=1.2.3.4,port=22,user=alice,password=xxx" \
--ssh "name=prod,host=5.6.7.8,port=22,user=bob,password=yyy"In MCP tool calls, specify the connection name via the connectionName parameter. If omitted, the default connection is used.
Example (execute command on 'prod' connection):
{
"tool": "execute-command",
"params": {
"cmdString": "ls -al",
"connectionName": "prod"
}
}Example (execute command with timeout options):
{
"tool": "execute-command",
"params": {
"cmdString": "ping -c 10 127.0.0.1",
"connectionName": "prod",
"timeout": 5000
}
}Command Execution Timeout
The execute-command tool supports timeout options to prevent commands from hanging indefinitely:
timeout: Command execution timeout in milliseconds (optional, default is 30000ms)
This is particularly useful for commands like ping, tail -f, or other long-running processes that might block execution.
List All SSH Servers
You can use the MCP tool list-servers to get all available SSH server configurations:
Example call:
{
"tool": "list-servers",
"params": {}
}Example response:
[
{ "name": "dev", "host": "1.2.3.4", "port": 22, "username": "alice" },
{ "name": "prod", "host": "5.6.7.8", "port": 22, "username": "bob" }
]Test Connection
Use the test-connection tool to verify SSH connectivity before running commands:
{
"tool": "test-connection",
"params": {
"connectionName": "prod"
}
}Example response:
{
"success": true,
"connectionTime": "245ms",
"server": {
"host": "192.168.1.1",
"port": 22,
"username": "root",
"hostname": "my-server"
}
}Batch Command Execution
Use the execute-batch tool to run multiple commands in sequence:
{
"tool": "execute-batch",
"params": {
"commands": ["cd /var/log", "ls -la", "df -h"],
"connectionName": "prod",
"stopOnError": true
}
}Example response:
{
"summary": {
"total": 3,
"executed": 3,
"succeeded": 3,
"failed": 0
},
"results": [
{ "command": "cd /var/log", "success": true, "output": "", "executionTime": "12ms" },
{ "command": "ls -la", "success": true, "output": "...", "executionTime": "15ms" },
{ "command": "df -h", "success": true, "output": "...", "executionTime": "18ms" }
]
}Using Environment Variables
For CI/CD pipelines or secure deployments, you can use environment variables instead of CLI arguments:
{
"mcpServers": {
"ssh-mcp-server": {
"command": "npx",
"args": ["-y", "ssh-mcp-server"],
"env": {
"SSH_HOST": "192.168.1.1",
"SSH_PORT": "22",
"SSH_USERNAME": "root",
"SSH_PASSWORD": "pwd123456"
}
}
}
}Working Directory and Sudo
The execute-command tool supports cwd and sudo parameters:
{
"tool": "execute-command",
"params": {
"cmdString": "ls -la",
"cwd": "/var/log",
"sudo": true
}
}Read Remote File
Read file contents with optional line range:
{
"tool": "read-file",
"params": {
"path": "/etc/nginx/nginx.conf",
"maxLines": 50,
"startLine": 10
}
}Write Remote File
Write content to remote files:
{
"tool": "write-file",
"params": {
"path": "/tmp/config.txt",
"content": "key=value\nother=setting",
"append": false,
"createDirs": true
}
}Get Server Status
Get comprehensive system information:
{
"tool": "get-status",
"params": {}
}Returns: hostname, OS, CPU, memory, disk, processes, services, uptime, and more.
Check Port
Check if a port is open:
{
"tool": "check-port",
"params": {
"port": 80,
"host": "localhost"
}
}Example response:
{
"port": 80,
"host": "localhost",
"open": true,
"service": "nginx",
"pid": "1234"
}Security Considerations
This server provides powerful capabilities to execute commands and transfer files on remote servers. To ensure it is used securely, please consider the following:
Command Whitelisting: It is strongly recommended to use the
--whitelistoption to restrict the set of commands that can be executed. Without a whitelist, any command can be executed on the remote server, which can be a significant security risk.Private Key Security: The server reads the SSH private key into memory. Ensure that the machine running the
ssh-mcp-serveris secure. Do not expose the server to untrusted networks.Denial of Service (DoS): The server does not have built-in rate limiting. An attacker could potentially launch a DoS attack by flooding the server with connection requests or large file transfers. It is recommended to run the server behind a firewall or reverse proxy with rate-limiting capabilities.
Path Traversal: The server has built-in protection against path traversal attacks on the local filesystem. However, it is still important to be mindful of the paths used in
uploadanddownloadcommands.
Available Tools
10 toolscheck-portC
Check if a port is open/listening on the remote server or test connectivity to external hosts
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port number to check | |
| host | No | Host to check (optional, default is 'localhost' for local port check) | |
| connectionName | No | SSH connection name (optional, default is 'default') | |
| timeout | No | Connection timeout in seconds (optional, default is 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions checking ports and connectivity but lacks critical details: whether this requires specific permissions (e.g., network access), what happens on failure (e.g., error messages), rate limits, or if it's a read-only operation. The dual-purpose nature (local vs. external) adds ambiguity without clarifying behavioral differences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core functionality. It avoids redundancy and waste, though it could be slightly more structured to separate local vs. external use cases for better clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (network operations with 4 parameters) and lack of annotations and output schema, the description is incomplete. It doesn't cover return values, error conditions, security implications, or how results are presented, leaving significant gaps for an agent to understand tool behavior fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds no additional parameter semantics beyond what's in the schema (e.g., it doesn't explain port ranges, host formats, or SSH connection implications). Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('check if a port is open/listening', 'test connectivity') and resources ('port', 'remote server', 'external hosts'). It distinguishes from some siblings like 'download' or 'upload', but doesn't explicitly differentiate from 'test-connection' which might have overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'test-connection' or other connectivity-related siblings. It mentions both local and external checks but doesn't specify scenarios or prerequisites for choosing between them, leaving the agent without clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
downloadC
Download file from connected server
| Name | Required | Description | Default |
|---|---|---|---|
| remotePath | Yes | Remote path | |
| localPath | Yes | Local path | |
| connectionName | No | SSH connection name (optional, default is 'default') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states the basic action but doesn't mention important behavioral aspects like error conditions (e.g., what happens if the file doesn't exist), authentication requirements, file size limitations, or whether the operation is idempotent. The description is minimal and lacks necessary operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at just 5 words, front-loading the essential information with zero wasted words. It efficiently communicates the core function without unnecessary elaboration, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a file transfer tool with no annotations and no output schema, the description is insufficient. It doesn't address what the tool returns (success/failure indicators, error messages), doesn't mention side effects (does it overwrite existing local files?), and provides minimal context about the server connection. The description should do more given the tool's complexity and lack of structured metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description doesn't add any meaningful semantic context beyond what's in the schema - it doesn't explain path format expectations, connection management, or default behavior. The baseline of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Download') and resource ('file from connected server'), providing a specific verb+resource combination. However, it doesn't distinguish this tool from its sibling 'upload' tool, which would require explicit comparison to achieve a score of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'read-file' or 'upload'. It mentions 'connected server' but doesn't specify prerequisites or contextual constraints, leaving the agent to infer usage scenarios without explicit direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute-batchC
Execute multiple commands in sequence on connected server
| Name | Required | Description | Default |
|---|---|---|---|
| commands | Yes | Array of commands to execute in sequence | |
| connectionName | No | SSH connection name (optional, default is 'default') | |
| timeout | No | Timeout per command in milliseconds (optional, default is 30000ms) | |
| stopOnError | No | Stop execution if a command fails (optional, default is false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions sequential execution but fails to disclose critical traits such as authentication requirements, error handling details beyond stopOnError, rate limits, or what happens on failure (e.g., partial results). This leaves significant gaps for a tool that executes commands on a server.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Execute multiple commands in sequence on connected server') with zero waste. Every word earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of executing multiple commands on a server, no annotations, and no output schema, the description is incomplete. It lacks details on return values, error scenarios, security implications, and how it interacts with sibling tools, making it inadequate for safe and effective use by an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds no additional meaning beyond implying 'multiple commands,' which is covered by the commands parameter. Baseline 3 is appropriate as the schema does the heavy lifting, but the description doesn't compensate with extra insights.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('execute multiple commands in sequence') and the target ('on connected server'), which distinguishes it from single-command tools like execute-command. However, it doesn't explicitly differentiate from other batch or sequential operations that might exist among siblings, though none are listed, making it clear but not fully sibling-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like execute-command for single commands or other tools for different operations. It lacks explicit context, prerequisites, or exclusions, leaving the agent to infer usage based on the need for multiple commands.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute-commandC
Execute command on connected server and get output result
| Name | Required | Description | Default |
|---|---|---|---|
| cmdString | Yes | Command to execute | |
| connectionName | No | SSH connection name (optional, default is 'default') | |
| timeout | No | Command execution timeout in milliseconds (optional, default is 30000ms) | |
| cwd | No | Working directory to execute the command in (optional) | |
| sudo | No | Execute command with sudo privileges (optional, default is false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions executing a command and getting output, but fails to cover critical aspects like security implications (e.g., potential for destructive commands), error handling, or output format details. This is inadequate for a tool that can perform arbitrary server operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's function without unnecessary words. It is front-loaded with the core action and result, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, no annotations, and no output schema, the description is insufficient. It doesn't address the complexity of command execution, such as handling different server environments, security risks, or what the 'output result' entails (e.g., stdout, stderr, exit codes).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters. The description adds no additional semantic context beyond implying execution occurs on a server, which is already suggested by the tool name. It doesn't explain parameter interactions or provide examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('execute command') and the target ('on connected server'), and specifies the outcome ('get output result'). It distinguishes from siblings like 'test-connection' or 'read-file' by focusing on command execution, though it doesn't explicitly contrast with 'execute-batch' which is a close sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'execute-batch' for multiple commands or 'test-connection' for connectivity checks. It lacks context about prerequisites (e.g., server must be connected) or exclusions (e.g., not for file operations).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-statusB
Get comprehensive system status information from the remote server (OS, CPU, memory, disk, processes, services)
| Name | Required | Description | Default |
|---|---|---|---|
| connectionName | No | SSH connection name (optional, default is 'default') | |
| refresh | No | Force refresh status instead of using cached data (optional, default is false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions retrieving data from a 'remote server' via SSH (implied by the connectionName parameter), but doesn't specify authentication requirements, rate limits, error conditions, or whether this is a read-only operation. The description adds minimal context beyond what's obvious from the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose. It could be slightly more structured by separating the 'what' from the 'components', but it avoids redundancy and every element (verb, resource, scope, components) earns its place without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read operation with 2 optional parameters and 100% schema coverage, the description is minimally adequate. However, with no annotations and no output schema, it should provide more behavioral context (e.g., response format, error handling). The listed components help, but don't fully compensate for missing structured data about the operation's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters. The description doesn't add any parameter-specific information beyond what's in the schema (e.g., it doesn't explain what 'comprehensive system status' includes beyond the listed components, or how refresh interacts with caching). Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'comprehensive system status information', specifying exactly what data is retrieved (OS, CPU, memory, disk, processes, services). It distinguishes this tool from siblings like 'check-port' or 'list-servers' by focusing on detailed system metrics rather than connectivity or file operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites like requiring an established SSH connection, nor does it compare to siblings like 'test-connection' for basic connectivity checks or 'execute-command' for custom queries. Usage context is implied but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-serversB
List all available SSH server configurations
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states it lists 'all available' configurations but doesn't disclose behavioral traits like whether this requires authentication, how results are formatted, if there are rate limits, or what 'available' means in practice. The description is minimal and lacks operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that efficiently communicates the core functionality without any wasted words. It's front-loaded with the essential information and appropriately sized for a simple listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is insufficiently complete. A listing tool should ideally describe what information is returned (e.g., server names, IPs, connection details) and any important constraints. The current description leaves too much undefined for practical agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately doesn't discuss parameters, maintaining focus on the tool's purpose. Baseline is 4 for zero-parameter tools when schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and resource ('SSH server configurations'), making the purpose immediately understandable. It doesn't differentiate from siblings like 'get-status' or 'test-connection' which might also retrieve server information, but it's specific enough to understand what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like 'get-status' and 'test-connection' that might provide overlapping functionality, there's no indication of when this listing operation is preferred over other server-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read-fileC
Read contents of a file from the remote server
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the file to read | |
| connectionName | No | SSH connection name (optional, default is 'default') | |
| maxLines | No | Maximum number of lines to read (optional, reads entire file if not specified) | |
| startLine | No | Line number to start reading from (optional, 1-indexed, default is 1) | |
| sudo | No | Read file with sudo privileges (optional, default is false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool reads file contents but doesn't mention potential side effects (e.g., whether it logs access, requires authentication, or has rate limits), error handling (e.g., what happens if the file doesn't exist), or output format (e.g., text, binary). This leaves significant gaps for a tool with remote server access.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's front-loaded with the core action ('Read contents'), making it easy to parse, and every part of the sentence contributes to understanding the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain what the tool returns (e.g., file content as text, error messages), behavioral constraints (e.g., file size limits, encoding issues), or how it interacts with sibling tools. Given the complexity and lack of structured data, more detail is needed for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description doesn't add any parameter-specific information beyond what's already in the schema, which has 100% coverage with clear descriptions for all 5 parameters. Since the schema fully documents parameters like 'path', 'maxLines', and 'sudo', the description meets the baseline but doesn't provide extra context (e.g., typical use cases for 'sudo' or line numbering conventions).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Read contents') and resource ('a file from the remote server'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'download' or 'upload', which also involve file operations but with different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'download' (which might retrieve files) or 'write-file' (which modifies files). There's no mention of prerequisites, such as needing an established connection or file permissions, leaving usage context unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test-connectionC
Test SSH connection and return server information
| Name | Required | Description | Default |
|---|---|---|---|
| connectionName | No | SSH connection name (optional, default is 'default') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool tests SSH connection and returns server information, but doesn't describe what 'server information' includes (e.g., OS details, uptime), how failures are handled, whether it requires authentication, or if it has side effects (e.g., logging attempts). This is a significant gap for a tool with potential security and operational implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded, consisting of a single, clear sentence that directly states the tool's function. There is no wasted verbiage or redundant information, making it efficient for quick comprehension by an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of SSH operations and the lack of annotations and output schema, the description is incomplete. It doesn't explain what 'server information' entails, how errors are reported, or any behavioral nuances (e.g., timeout settings). For a tool that interacts with external systems, this leaves critical gaps in understanding its full context and usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the single parameter 'connectionName' documented as optional with a default value. The description doesn't add any meaning beyond this, such as explaining what a 'connection name' represents or how it maps to SSH configurations. Given the high schema coverage, a baseline score of 3 is appropriate, as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Test SSH connection') and resource ('server information'), making it immediately understandable. However, it doesn't explicitly distinguish this tool from siblings like 'check-port' or 'get-status', which might also involve connection testing or server status checking, leaving some ambiguity about its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., SSH setup), exclusions (e.g., when other tools might be better), or contextual cues (e.g., use for initial connectivity checks before operations like 'execute-command'). This lack of usage context leaves the agent to infer appropriate scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uploadC
Upload file to connected server
| Name | Required | Description | Default |
|---|---|---|---|
| localPath | Yes | Local path | |
| remotePath | Yes | Remote path | |
| connectionName | No | SSH connection name (optional, default is 'default') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action ('upload') but doesn't describe potential side effects (e.g., file overwriting, network usage), authentication needs, error conditions, or response format. This is inadequate for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core action and resource, making it easy to parse. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a mutation tool (upload implies write) with no annotations and no output schema, the description is incomplete. It lacks critical details like success/failure behavior, file size limits, or connection requirements. The schema covers parameters well, but overall context for safe use is insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters with basic descriptions. The description adds no additional meaning about parameters beyond implying file transfer between local and remote paths. Baseline 3 is appropriate as the schema handles the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('upload') and resource ('file to connected server'), making the purpose immediately understandable. It distinguishes from siblings like 'download' and 'write-file' by specifying the direction and target. However, it doesn't explicitly differentiate from all siblings (e.g., 'execute-batch' is unrelated).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'write-file' or 'download'. It doesn't mention prerequisites (e.g., needing an established connection) or exclusions (e.g., not for local operations). The context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write-fileC
Write content to a file on the remote server
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the file to write | |
| content | Yes | Content to write to the file | |
| connectionName | No | SSH connection name (optional, default is 'default') | |
| append | No | Append to file instead of overwriting (optional, default is false) | |
| sudo | No | Write file with sudo privileges (optional, default is false) | |
| createDirs | No | Create parent directories if they don't exist (optional, default is false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. While 'write content' implies a mutation operation, the description doesn't mention permission requirements, error conditions, side effects (like overwriting existing files), or what happens on success/failure. For a file write tool with zero annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's appropriately sized and front-loaded with the core functionality, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a file write operation with 6 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain what the tool returns, error handling, or important behavioral aspects like whether it creates files, overwrites existing content, or requires specific permissions. The description should provide more context given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema. The description doesn't add any parameter-specific information beyond what's already in the schema descriptions. The baseline of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('write content') and target ('to a file on the remote server'), providing a specific verb+resource combination. However, it doesn't distinguish this tool from its sibling 'upload', which might have overlapping functionality for file operations on remote servers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'upload' or 'read-file'. There's no mention of prerequisites, use cases, or exclusions, leaving the agent to infer usage context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
10 tool updates
v1.0.1- First observed
check-port - First observed
download - First observed
execute-batch - First observed
execute-command - First observed
get-status - First observed
list-servers - First observed
read-file - First observed
test-connection - First observed
upload - First observed
write-file
TDQS
Each tool has a clearly distinct purpose with no significant overlap: check-port tests connectivity, execute-command and execute-batch handle command execution, get-status retrieves system info, list-servers manages configurations, and read-file/write-file/upload/download handle file operations. The descriptions clearly differentiate these functions, making misselection unlikely.
All tools follow a consistent verb-noun naming pattern using kebab-case (e.g., check-port, execute-command, list-servers). This uniformity makes the tool set predictable and easy to understand, with no deviations in style or convention.
With 10 tools, the count is well-scoped for an SSH server management domain. Each tool serves a distinct and necessary function, such as connection testing, command execution, file management, and system monitoring, without being excessive or insufficient for the intended purpose.
The tool set provides comprehensive coverage for SSH server operations, including connection management (test-connection, list-servers), system monitoring (get-status, check-port), command execution (execute-command, execute-batch), and full file CRUD operations (read-file, write-file, upload, download). No obvious gaps exist for core workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
- emisarOAuthdev.emisar
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Scoped, audited SSH exec, sessions, and SFTP on your saved servers without exposing credentials
Provides capabilities that let LLM agents perform a range of infrastructure management tasks.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to execute commands and transfer files on remote servers over SSH connections.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to securely execute commands, transfer files, and manage port forwarding on remote servers via SSH.16836Apache 2.0
- AlicenseAqualityAmaintenanceEnables AI assistants to manage remote servers via SSH with 14 commands for execution, file transfer, auditing, and monitoring.186273MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to securely execute commands on remote hosts via SSH and SFTP, with persistent shells, file transfers, screenshots, and an audit log.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ZachFlint/ssh-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server