Skip to main content
Glama
guozhiwei01

ai-ssh-mcp

by guozhiwei01
README.md
# ai-ssh-mcp

Natural language SSH server management via Claude Code.

Stop copying commands from AI to your terminal. This MCP server lets Claude Code connect directly to your servers — read logs, check services, run commands, transfer files — all in one conversation.

---

## Features

- **Read logs** — tail Laravel / nginx logs with keyword filtering
- **Service status** — check nginx, php-fpm, mysql, redis and system resources (memory, disk, load)
- **Execute commands** — run any shell command with a write-operation confirmation step
- **File transfer** — upload / download files via SFTP
- **Batch execute** — run a command across multiple servers in parallel, filtered by tag
- **Safety layer** — blacklist for destructive commands, confirmation prompts for write ops, operation log
- **Fuzzy server matching** — refer to servers by partial name (e.g. "生产API" matches "生产-API主服务器")
- **Connection reuse** — SSH connections are cached for the session

---

## Prerequisites

- Python 3.11+
- [uv](https://github.com/astral-sh/uv) package manager
- [Claude Code](https://claude.ai/code) CLI

---

## Installation

No cloning required. Add the following to your project's `.mcp.json`:

```json
{
  "mcpServers": {
    "ai-ssh-mcp": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/guozhiwei01/ai-ssh-mcp", "ai-ssh-mcp"]
    }
  }
}
```

Restart Claude Code. On first run, the config directory is created automatically at `~/.config/ai-ssh-mcp/` with a template `servers.json` copied in.

---

## Configuration

### 1. Server list (`~/.config/ai-ssh-mcp/servers.json`)

The template is created automatically on first run. Edit it to add your servers:

```json
{
  "servers": [
    {
      "name": "生产-API主服务器",
      "host": "47.x.x.1",
      "port": 22,
      "username": "root",
      "auth": {
        "type": "privateKey",
        "path": "~/.ssh/id_rsa"
      },
      "tags": ["prod", "api"],
      "projects": [
        {
          "name": "shop",
          "path": "/var/www/shop",
          "log": "/var/www/shop/storage/logs/laravel.log",
          "nginx_log": "/var/log/nginx/shop_error.log",
          "fpm_pool": "shop"
        }
      ]
    }
  ]
}
```

Key fields:

| Field | Description |
|-------|-------------|
| `name` | Display name (Chinese-friendly). Claude uses this to identify servers. |
| `host` | IP address or hostname |
| `port` | SSH port, default `22` |
| `username` | SSH login user |
| `auth.type` | `privateKey` or `password` |
| `auth.path` | Path to private key file (supports `~`) |
| `auth.env_key` | For password auth: the `.env` variable name that holds the password |
| `tags` | Used for batch operations, e.g. `["prod", "api"]` |
| `projects` | List of deployed projects with log paths |

### 2. Credentials (`~/.config/ai-ssh-mcp/.env`)

For password-authenticated servers, create `~/.config/ai-ssh-mcp/.env`:

```env
SERVER_生产数据库_PASSWORD=your_password_here
```

> Private key auth needs no `.env` entries — just make sure the key file exists at the configured path.

---

## Usage Examples

Once connected, talk to Claude naturally:

> "列出所有服务器"

> "看一下生产 API 服务器上 shop 项目最近的报错"

> "检查生产数据库的服务状态"

> "在测试环境重启 nginx"  *(Claude will ask for confirmation)*

> "所有 prod 服务器的磁盘使用情况"

> "把本地的 config.php 上传到生产-API主服务器的 /var/www/shop/config.php"

---

## Available Tools

| Tool | Description |
|------|-------------|
| `list_servers` | List all configured servers |
| `read_logs` | Read project log files (app or nginx), with optional keyword filter |
| `service_status` | Check service health and system resources |
| `exec_command` | Run any shell command (write ops require confirmation) |
| `transfer_file` | Upload or download files via SFTP |
| `batch_exec` | Run a command on multiple servers in parallel |

---

## Security

- **Blacklist**: `rm -rf /`, `mkfs`, `dd if=...of=/dev`, `shutdown`, `reboot`, `halt`, `poweroff` are always blocked.
- **Confirmation**: Any write operation (restart, kill, file modification, package install, etc.) returns a confirmation prompt before executing.
- **Operation log**: All executed commands are recorded in `~/.config/ai-ssh-mcp/operation.log` — format: `timestamp | server | user | command | exit_code`.
- **Secrets**: `servers.json` and `.env` live in your home directory and are never part of this repo.

---

## License

MIT

TDQS

A3.8/5.0

Scored across 6 tools

Disambiguation5/5

每个工具都有明确且互不重叠的用途:列出服务器、单机执行命令、批量执行命令、读取日志、检查服务状态、传输文件。描述清晰,代理可以轻松区分。

Naming Consistency4/5

大多数工具遵循 verb_noun 模式(如 exec_command, list_servers, read_logs, transfer_file),但 batch_exec 是 adj_verb 形式,service_status 是 noun_noun,存在小偏差,整体仍可接受。

Tool Count5/5

6个工具覆盖了远程服务器管理的基本需求:执行命令、批量操作、日志、状态、文件传输和服务器列表。数量合理,没有冗余或不足。

Completeness3/5

覆盖了核心运维任务(命令执行、日志、文件传输、状态),但缺少服务启停、配置编辑、用户管理等常见操作,存在明显缺口。