mcp-ssh-tool

mcp-ssh-tool

A Model Context Protocol (MCP) SSH client server that provides autonomous SSH operations for GitHub Copilot and VS Code. Enable natural language SSH automation without manual prompts or GUI interactions.

Category
访问服务器

README

mcp-ssh-tool

npm version npm downloads license

A Model Context Protocol (MCP) SSH client server that provides autonomous SSH operations for GitHub Copilot and VS Code. Enable natural language SSH automation without manual prompts or GUI interactions.

Quick Start

Install

  • Global install (recommended): npm install -g mcp-ssh-tool
  • One-off run: npx mcp-ssh-tool

MCP Client Configuration (VS Code / Claude Desktop / others)

Add to your MCP configuration (mcp.json, .vscode/mcp.json, or the Claude Desktop MCP config):

{
  "servers": {
    "ssh-mcp": {
      "type": "stdio",
      "command": "mcp-ssh-tool",
      "args": []
    }
  }
}

Usage Examples

Once configured, you can use natural language with your MCP client:

  • SSH Connection: "Connect to server 192.168.1.100 as admin using SSH key"
  • File Operations: "Read the content of /etc/nginx/nginx.conf on the server"
  • Command Execution: "Run 'systemctl status nginx' on the remote server"
  • Package Management: "Install htop package on Ubuntu server"
  • Service Control: "Restart the nginx service"

Available Tools

  • ssh_open_session - Establish SSH connection with various auth methods
  • ssh_close_session - Close SSH session
  • ssh_list_sessions - List all active SSH sessions
  • ssh_ping - Check if a session is alive and responsive
  • ssh_list_configured_hosts - List hosts from ~/.ssh/config
  • ssh_resolve_host - Resolve host alias from SSH config
  • proc_exec - Execute commands remotely (with optional timeout)
  • proc_sudo - Execute commands with sudo privileges
  • fs_read, fs_write, fs_list, fs_stat, fs_mkdir, fs_rm, fs_rename - File system operations
  • ensure_package - Package management
  • ensure_service - Service control
  • ensure_line_in_file - File line management
  • patch_apply - Apply patches to files
  • detect_os - System information detection

Overview

The SSH MCP Server acts as a bridge between GitHub Copilot and remote systems via SSH. It supports:

  • Non-interactive SSH operations - No prompts or GUI interactions
  • Multiple authentication methods - Password, SSH keys, or SSH agent
  • Session management - Automatic connection pooling with TTL and LRU eviction
  • File system operations - Read, write, list, and manage remote files via SFTP
  • Process execution - Run commands and sudo operations remotely
  • High-level automation - Package management, service control, and configuration management
  • Security - Automatic redaction of sensitive data in logs

Architecture

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│  GitHub Copilot │────│  SSH MCP Server  │────│  Remote Systems │
│     / VS Code   │    │                  │    │   (via SSH)     │
└─────────────────┘    └──────────────────┘    └─────────────────┘
         │                       │                       │
         │ MCP stdio protocol    │ Session management    │ SSH + SFTP
         │                       │ LRU cache + TTL       │
         │                       │ Auth strategies       │

Installation

Prerequisites

  • Node.js ≥ 18 (LTS)
  • SSH access to target systems
  • SSH keys or credentials for authentication

Install from npm

npm install -g mcp-ssh-tool

Build from source

git clone https://github.com/oaslananka/mcp-ssh-tool.git
cd mcp-ssh-tool
npm install
npm run build
npm link

CLI Flags

  • --help / -h: Show usage and examples.
  • --version / -v: Print version.
  • --stdio: Force stdio mode (default).

Note: This is an MCP stdio server. The terminal is not an interactive shell; use an MCP client (Claude Desktop, VS Code MCP, etc.) or send JSON-RPC over stdio.

Platform Notes

  • Linux / macOS: Uses POSIX shell wrappers with safe quoting. Default temp directory: /tmp.
  • Windows targets: Requires OpenSSH server/agent; key discovery checks C:\\Users\\<you>\\.ssh\\. Commands are wrapped for PowerShell-safe execution. Package/service helpers are intentionally disabled on Windows targets.
  • Host keys: Host key checking is relaxed by default. Set STRICT_HOST_KEY_CHECKING=true and optionally KNOWN_HOSTS_PATH to enforce verification.

ChatGPT Desktop Integration

Quick Setup

npm run setup:chatgpt

This command automatically configures ChatGPT Desktop to use mcp-ssh-tool.

Manual Setup

Add to your ChatGPT Desktop MCP config:

  • macOS: ~/Library/Application Support/ChatGPT/mcp.json
  • Windows: %APPDATA%\ChatGPT\mcp.json
  • Linux: ~/.config/chatgpt/mcp.json
{
  "mcpServers": {
    "ssh-mcp-server": {
      "name": "ssh-mcp-server",
      "command": "npx",
      "args": ["-y", "mcp-ssh-tool"]
    }
  }
}

For detailed usage, see docs/chatgpt-usage.md.

VS Code Copilot Integration

User-level Configuration (Recommended)

Open VS Code and press Ctrl+Shift+P, then run "MCP: Open User Configuration".

Add to your mcp.json:

{
  "servers": {
    "ssh-mcp": {
      "type": "stdio",
      "command": "mcp-ssh-tool",
      "args": []
    }
  }
}

Workspace-level Configuration

Create .vscode/mcp.json in your workspace:

{
  "servers": {
    "ssh-mcp": {
      "type": "stdio",
      "command": "mcp-ssh-tool",
      "args": []
    }
  }
}

Verification

  1. Restart VS Code
  2. Open Copilot Chat
  3. The SSH MCP tools should appear in the available tools list
  4. Test with: "Connect to 192.168.1.100 as admin and run 'uname -a'"

Usage Examples

Basic Connection and Command Execution

"Connect to 10.11.12.13 as deployer with password 'mypass' and run 'df -h'"

File Operations

"Connect to server.example.com as admin, read /etc/nginx/nginx.conf and show me the server blocks"

System Administration

"Connect to 192.168.1.50 as root, install htop package, start nginx service, and list /var/www contents"

Configuration Management

"Connect to web-server as admin, add these lines to /etc/hosts:
192.168.1.10 db-server
192.168.1.20 cache-server
Then restart networking service"

API Reference

Session Management

ssh.openSession

Opens a new SSH session with authentication.

Input:

{
  "host": "example.com",
  "username": "admin",
  "port": 22,
  "auth": "auto",
  "password": "optional",
  "privateKey": "optional-inline-key",
  "privateKeyPath": "optional-path",
  "passphrase": "optional",
  "useAgent": false,
  "readyTimeoutMs": 20000,
  "ttlMs": 900000
}

Output:

{
  "sessionId": "ssh-1645123456789-1",
  "host": "example.com",
  "username": "admin",
  "expiresInMs": 900000
}

ssh.closeSession

Closes an active SSH session.

Input:

{
  "sessionId": "ssh-1645123456789-1"
}

Output:

{
  "ok": true
}

Process Execution

proc.exec

Executes a command on the remote system.

Input:

{
  "sessionId": "ssh-1645123456789-1",
  "command": "ls -la /home",
  "cwd": "/tmp",
  "env": {"DEBUG": "1"}
}

Output:

{
  "code": 0,
  "stdout": "total 12\ndrwxr-xr-x 3 root root 4096...",
  "stderr": "",
  "durationMs": 245
}

proc.sudo

Executes a command with sudo privileges.

Input:

{
  "sessionId": "ssh-1645123456789-1",
  "command": "systemctl restart nginx",
  "password": "sudo-password",
  "cwd": "/etc"
}

File System Operations

fs.read

Reads a file from the remote system.

Input:

{
  "sessionId": "ssh-1645123456789-1",
  "path": "/etc/hosts",
  "encoding": "utf8"
}

Output:

{
  "data": "127.0.0.1 localhost\n::1 localhost\n..."
}

fs.write

Writes data to a file (atomic operation using temp file + rename).

Input:

{
  "sessionId": "ssh-1645123456789-1",
  "path": "/tmp/config.txt",
  "data": "server_name example.com;\nlisten 80;",
  "mode": 644
}

fs.stat

Gets file or directory statistics.

Output:

{
  "size": 1024,
  "mtime": "2024-01-15T10:30:00.000Z",
  "mode": 33188,
  "type": "file"
}

fs.list

Lists directory contents with pagination.

Input:

{
  "sessionId": "ssh-1645123456789-1",
  "path": "/var/log",
  "page": 0,
  "limit": 50
}

Output:

{
  "entries": [
    {
      "name": "nginx",
      "type": "directory",
      "size": 4096,
      "mtime": "2024-01-15T10:30:00.000Z",
      "mode": 16877
    }
  ],
  "nextToken": "1"
}

fs.mkdirp

Creates directories recursively (mkdir -p equivalent).

fs.rmrf

Removes files or directories recursively (rm -rf equivalent).

fs.rename

Renames or moves files and directories.

High-Level Operations

ensure.package

Ensures a package is installed using the system's package manager.

Input:

{
  "sessionId": "ssh-1645123456789-1",
  "name": "nginx",
  "sudoPassword": "optional"
}

Output:

{
  "ok": true,
  "pm": "apt",
  "code": 0,
  "stdout": "Package nginx is already installed",
  "stderr": ""
}

ensure.service

Manages system services (systemd or traditional service).

Input:

{
  "sessionId": "ssh-1645123456789-1",
  "name": "nginx",
  "state": "started",
  "sudoPassword": "optional"
}

ensure.linesInFile

Ensures specific lines exist in a file (idempotent).

Input:

{
  "sessionId": "ssh-1645123456789-1",
  "path": "/etc/hosts",
  "lines": ["192.168.1.10 db-server", "192.168.1.20 cache-server"],
  "createIfMissing": true,
  "sudoPassword": "optional"
}

patch.apply

Applies a patch to a file using the patch command.

os.detect

Detects operating system information, package manager, and init system.

Output:

{
  "platform": "linux",
  "distro": "ubuntu",
  "version": "22.04",
  "arch": "x86_64",
  "shell": "bash",
  "packageManager": "apt",
  "init": "systemd",
  "defaultShell": "bash",
  "tempDir": "/tmp"
}

Authentication

The server supports multiple authentication methods with automatic fallback:

Authentication Strategy Priority

  1. Password (if provided)
  2. SSH Key (inline → path → auto-discovery)
  3. SSH Agent (if available)

SSH Key Auto-Discovery

The server automatically searches for SSH keys in:

  • ~/.ssh/id_ed25519
  • ~/.ssh/id_rsa
  • ~/.ssh/id_ecdsa

Note: DSA keys (id_dsa) are no longer supported due to security concerns.

Custom key directory: Set SSH_DEFAULT_KEY_DIR environment variable.

Examples

Password Authentication:

{
  "host": "server.com",
  "username": "admin",
  "auth": "password",
  "password": "secret"
}

SSH Key (inline):

{
  "host": "server.com",
  "username": "admin",
  "auth": "key",
  "privateKey": "-----BEGIN PRIVATE KEY-----\n...",
  "passphrase": "optional"
}

SSH Key (file path):

{
  "host": "server.com",
  "username": "admin",
  "auth": "key",
  "privateKeyPath": "/home/user/.ssh/id_rsa"
}

SSH Agent:

{
  "host": "server.com",
  "username": "admin",
  "auth": "agent"
}

Configuration

Environment Variables

  • LOG_LEVEL - Logging level (error, warn, info, debug)
  • SSH_DEFAULT_KEY_DIR - Custom SSH key directory
  • STRICT_HOST_KEY_CHECKING - Enable strict host key checking
  • KNOWN_HOSTS_PATH - Custom known_hosts file path

Default Settings

  • Connection timeout: 20 seconds
  • Session TTL: 15 minutes
  • Max concurrent sessions: 20
  • Host key checking: Relaxed (disabled by default)

Error Codes

The server returns structured error codes for machine-readable error handling:

  • EAUTH - Authentication failed
  • ECONN - Connection error
  • ETIMEOUT - Operation timeout
  • ENOSUDO - Sudo operation failed
  • EPMGR - Package manager not found
  • EFS - File system operation failed
  • EPATCH - Patch application failed
  • EBADREQ - Invalid request parameters

Each error includes:

  • name: Error class name
  • code: Machine-readable error code
  • message: Human-readable error message
  • hint: Optional suggestion for resolution

Security Features

Data Redaction

Sensitive data is automatically redacted from logs:

  • Passwords
  • Private keys
  • Passphrases
  • Sudo passwords
  • SSH agent socket paths

Connection Security

  • Configurable host key verification
  • Support for known_hosts files
  • Connection timeout enforcement
  • Automatic session cleanup

Session Management

  • TTL-based session expiration
  • LRU cache eviction
  • Graceful connection cleanup
  • No persistent credential storage

Development

Setup

git clone https://github.com/oaslananka/mcp-ssh-tool.git
cd mcp-ssh-tool
npm install

Scripts

npm run build      # Compile TypeScript
npm run dev        # Watch mode compilation
npm run test       # Run unit tests
npm run e2e        # Run E2E tests (requires RUN_SSH_E2E=1)
npm run lint       # Type-check (no emit)
npm run format     # Run Prettier
npm run test:coverage
npm run docs

Testing

Unit Tests:

npm test

E2E Tests (optional):

RUN_SSH_E2E=1 npm run e2e

License

MIT License

Copyright (c) 2025 Osman Aslan (oaslananka)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

E2E tests require a local Docker container or SSH server for testing.

Contributing

  1. Follow TypeScript and ESLint rules
  2. Add tests for new features
  3. Update documentation
  4. Ensure all tests pass
  5. Use conventional commit messages

License

MIT License - see LICENSE file for details.

Related Links

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选