Skip to main content
Glama
ffpy

my-mcp-ssh

by ffpy
README.md
# my-mcp-ssh
[![EN doc](https://img.shields.io/badge/document-English-blue.svg)](README.md)
[![CN doc](https://img.shields.io/badge/文档-中文版-blue.svg)](README_zh_CN.md)

A Model Context Protocol (MCP) based SSH connection tool that allows large language models to securely connect to remote servers via SSH and perform file operations through the MCP protocol.

## Features

- SSH Connection Management: Connect to remote SSH servers
- Command Execution: Execute commands on remote servers
- File Transfer: Upload and download files
- Session Management: Maintain and close SSH sessions

## Installation
### Dependencies
- Python >= 3.12
- uv package manager

```bash
# Clone the project
git clone https://github.com/ffpy/my-mcp-ssh.git

# Enter the project directory
cd my-mcp-ssh

# Install dependencies
uv sync
```

## Usage
### Configure in client
```json
{
  "mcpServers": {
    "my-mcp-ssh": {
      "command": "uv",
      "args": [
        "--directory",
        "<your_path>/my-mcp-ssh",
        "run",
        "src/main.py"
      ],
      "env": {}
    }
  }
}
```

### Environment Variables

#### SSH Connection Defaults (Optional)

Environment variables provide default values for SSH connections, useful when frequently connecting to the same server or in automated environments:

- `SSH_HOST`: SSH server hostname or IP address
- `SSH_PORT`: SSH server port
- `SSH_USERNAME`: SSH username
- `SSH_PASSWORD`: SSH password (if using password authentication)
- `SSH_KEY_PATH`: SSH private key file path (if using key authentication)
- `SSH_KEY_PASSPHRASE`: SSH private key passphrase (if needed)

**When to use SSH environment variables:**
- **Repeated connections**: When connecting to the same server multiple times
- **CI/CD pipelines**: For automated deployment scripts
- **Development environments**: Set defaults for your commonly used servers
- **Container deployments**: Configure defaults without modifying code

**Note**: Parameters passed to the `connect` tool always override environment variables.

#### Server Configuration

Additional server behavior can be configured:

- `SESSION_TIMEOUT`: Session timeout in minutes, default is 30 minutes
- `MAX_OUTPUT_LENGTH`: Maximum command output length in characters, default is 5000 characters

### SSH Credentials File

For better security, you can store SSH credentials in a local configuration file instead of passing passwords as parameters.

1. Copy the example file:
```bash
cp ssh-credentials.json.example ssh-credentials.json
```

2. Edit `ssh-credentials.json` with your actual credentials:
```json
{
  "root@192.168.1.100": "your_password",
  "admin@web-[0-9].example.com": "web_password",
  "deploy@server-{dev,test,staging}.company.com": "deploy_password",
  "admin@*.internal.network": "internal_password"
}
```

**Supported Patterns:**
- `*` - matches any characters
- `?` - matches single character  
- `[0-9]` - matches any digit
- `{dev,test,staging}` - matches any of the listed options

**Authentication Priority Order:**
1. Parameters passed to connect tool (`password`, `key_path`)
2. Exact match in credentials file (`username@host`)
3. Pattern match in credentials file (wildcards)
4. Environment variable password (`SSH_PASSWORD`)
5. Environment variable key (`SSH_KEY_PATH`)
6. Default SSH key (`~/.ssh/id_rsa` if exists)

**Security:**
- File permissions are automatically set to 600 (owner read/write only)
- The file is added to .gitignore to prevent accidental commits

**Note:**
- Credential file changes take effect immediately without server restart
- The file is read fresh on each connection attempt

## Tool List

### connect

Connect to an SSH server

**Parameters:**
- `host`: SSH server hostname or IP address (optional)
- `port`: SSH server port (optional, default 22)
- `username`: SSH username (optional)
- `password`: SSH password for authentication (optional)
- `key_path`: SSH private key file path for authentication (optional)
- `key_passphrase`: SSH private key passphrase if needed (optional)

### disconnect

Disconnect from an SSH session

**Parameters:**
- `session_id`: The session ID to disconnect

### list_sessions

List all active SSH sessions

**Parameters:**
- None

### execute

Execute a command on the SSH server

**Parameters:**
- `session_id`: Session ID
- `command`: Command to execute
- `stdin`: Input string to provide to the command, default is empty
- `timeout`: Command timeout in seconds, default is 60 seconds

### upload

Upload a file to the SSH server

**Parameters:**
- `session_id`: Session ID
- `local_path`: Local file path
- `remote_path`: Remote file path

### download

Download a file from the SSH server

**Parameters:**
- `session_id`: Session ID
- `remote_path`: Remote file path
- `local_path`: Local file path

## Debugging
Run `./inspector.sh` for online debugging

## License
my-mcp-ssh is licensed under the Apache License, Version 2.0 

TDQS

A3.8/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct action: connect/disconnect manage sessions, list_sessions enumerates them, execute runs commands, and upload/download transfer files. There is no overlap or ambiguity between tool purposes.

Naming Consistency5/5

All tool names follow a clear imperative verb style, using lowercase with underscores. The names are concise and predictable, with list_sessions being the only verb_noun form, which is appropriate for a listing operation.

Tool Count5/5

The server provides 6 tools, which is well-scoped for an SSH MCP server. Each tool serves a core function (session management, command execution, file transfer) without unnecessary bloat, fitting the typical 3-15 tool range.

Completeness5/5

The tool surface covers the full lifecycle of SSH interactions: connect, disconnect, session listing, command execution, and file upload/download. No obvious gaps exist for standard SSH usage, making the set complete for its stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues