4 releases

Uses new Rust 2024

new 0.1.3 May 16, 2025
0.1.2 May 16, 2025
0.1.1 May 16, 2025
0.1.0 May 16, 2025

#509 in Network programming

Download history

75 downloads per month

MIT license

26KB
399 lines

SSH-MCP Server

Crates.io Version Docker Image Version

A Rust implementation of an SSH client server with Model Context Protocol (MCP) integration, allowing Large Language Models (LLMs) to connect to a SSH server and utilize SSH features.

Lightweight and Efficient:

  • 🚀 ssh-mcp: only 4.3MB binary size, 1.8MB memory footprint
  • 🔄 ssh-mcp-stdio: only 1.5MB binary size, 2.3MB memory usage
  • 🐳 docker: only 27.5MB final image size

Features

  • SSH Client Integration: Connect to SSH servers via MCP commands
  • SSH Command Execution: Run commands on remote SSH servers
  • Port Forwarding: Setup SSH tunnels and port forwards (enabled by default via the port_forward feature)
  • Session Management: Track and manage multiple SSH sessions
  • MCP Protocol Support: Built with poem-mcpserver to enable AI/LLM compatibility
  • Stateful Connections: Maintain SSH sessions across multiple commands

Installation and Integration

You have two options for installation:

No Rust toolchain required - just Docker!

# Pull the pre-built image from Docker Hub
docker pull mingyang91/ssh-mcp

# Run the server
docker run -p 8000:8000 mingyang91/ssh-mcp

Or build the image yourself:

# Build the Docker image
docker build -t ssh-mcp .

# Run the server
docker run -p 8000:8000 ssh-mcp

Option 2: Installing via Cargo

Prerequisites:

  • Rust 1.70.0 or later
  • Cargo package manager
cargo install ssh-mcp

Integration with mcpServers

To use SSH-MCP with mcpServers, add the following configuration to your mcpServers JSON configuration:

If installed via Cargo:

{
  "mcpServers": {
    "ssh": {
      "command": "ssh-mcp-stdio", 
      "args": []
    }
  }
}

If using Docker:

{
  "mcpServers": {
    "ssh": {
      "command": "docker",
      "args": ["run", "--entrypoint", "ssh-mcp-stdio", "-i", "--rm", "ssh-mcp"]
    }
  }
}

This will register the SSH handler, allowing LLMs to manage SSH connections through your MCP server.

Usage

Connecting to an SSH Server

Using Password Authentication

{
  "command": "ssh_connect",
  "params": {
    "address": "example.com:22",
    "username": "user",
    "password": "password"
  }
}

Using Key Authentication

{
  "command": "ssh_connect",
  "params": {
    "address": "example.com:22",
    "username": "user",
    "key_path": "/path/to/private_key"
  }
}

Using SSH Agent Authentication

{
  "command": "ssh_connect",
  "params": {
    "address": "example.com:22",
    "username": "user"
  }
}

Response:

{
  "session_id": "c8a3b2e1-4f5d-6e7c-8a9b-0c1d2e3f4a5b",
  "message": "Successfully connected to user@example.com:22",
  "authenticated": true
}

If connection fails:

{
  "error": "Failed to connect: Connection refused"
}

Executing Commands

{
  "command": "ssh_execute",
  "params": {
    "session_id": "c8a3b2e1-4f5d-6e7c-8a9b-0c1d2e3f4a5b",
    "command": "ls -la"
  }
}

Response:

{
  "stdout": "total 32\ndrwxr-xr-x  5 user group 4096 Jan 1 12:00 .\ndrwxr-xr-x 25 user group 4096 Jan 1 12:00 ..\n-rw-r--r--  1 user group  142 Jan 1 12:00 file.txt\n",
  "stderr": "",
  "exit_code": 0
}

Setting Up Port Forwarding

Note: Port forwarding is enabled by default via the port_forward feature flag.

{
  "command": "ssh_forward",
  "params": {
    "session_id": "c8a3b2e1-4f5d-6e7c-8a9b-0c1d2e3f4a5b",
    "local_port": 8080,
    "remote_address": "internal-server",
    "remote_port": 80
  }
}

Response:

{
  "local_address": "127.0.0.1:8080",
  "remote_address": "internal-server:80",
  "active": true
}

Disconnecting a Session

{
  "command": "ssh_disconnect",
  "params": {
    "session_id": "c8a3b2e1-4f5d-6e7c-8a9b-0c1d2e3f4a5b"
  }
}

Response:

"Session c8a3b2e1-4f5d-6e7c-8a9b-0c1d2e3f4a5b disconnected successfully"

Listing All Active Sessions

{
  "command": "ssh_list_sessions"
}

Response:

[
  "c8a3b2e1-4f5d-6e7c-8a9b-0c1d2e3f4a5b",
  "d9b4c3a2-5e6f-7g8h-9i0j-1k2l3m4n5o6p"
]

Configuration

The server can be configured through the following environment variables:

Variable Description Default
MCP_PORT Port for the MCP server 8000
RUST_LOG Logging level info

Features Configuration

The project uses Cargo features to enable/disable certain functionality:

Feature Description Default
port_forward Enables SSH port forwarding support Enabled

To build without port forwarding:

cargo build --release --no-default-features

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

CI/CD Pipeline

This project uses GitHub Actions for continuous integration and deployment:

  • All PRs and commits to main are automatically tested
  • Tagged releases (starting with 'v') are automatically published to crates.io
  • Docker images are automatically built and pushed to Docker Hub
    • Latest tag for main branch
    • Version tags for semantic versioned releases (v1.0.0, v1.0, etc.)
  • To create a new release, ensure version in Cargo.toml matches the tag (e.g., v0.1.0)
  • You'll need to set up the CARGO_REGISTRY_TOKEN, DOCKERHUB_USERNAME, and DOCKERHUB_TOKEN secrets in your GitHub repository settings

License

This project is licensed under the MIT License - see the LICENSE file for details.

Dependencies

~21–33MB
~540K SLoC