mcpField
S
SSH LICCO MCP Server

SSH LICCO MCP Server

ローカル
github.com/Echoqiliクラウド・インフラ42 日前に更新

SSH LICCO MCP Server について

SSH LICCOは、AIクライアントからSSH経由でリモートホストを管理する開発者や運用担当者向けのMCPサーバーです。コマンド、ファイル、Docker、セッション操作に加え、セキュリティポリシーと危険なコマンドの遮断機能を備えています。

主な機能

  1. 01SSHコマンド実行とセッション管理
  2. 02SFTP転送とリモートファイル編集
  3. 03Dockerとプロセスの管理
  4. 04バッチ実行と接続プール
  5. 05セキュリティポリシーと危険コマンドの遮断
  6. 06監査ログと鍵の管理

活用シーン

  1. 01自然言語でサーバーの状態を確認
  2. 02ファイルのアップロードとリモートディレクトリ管理
  3. 03Dockerイメージのビルドと進捗確認
  4. 04永続セッションとリモートプロセスの管理

MCP 対応

MCPサーバーとして、SSH接続、コマンド実行、ファイル転送、ホストやDockerの管理、鍵生成、セッション、プロセス操作のツールを公開します。stdio経由でTrae、Cursor、Claude Desktopなどのクライアントに設定できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"echoqili-ssh-licco": {
"command": "uvx",
"args": [
"ssh-licco"
],
"env": {
"SSH_HOST": "<SSH_HOST>",
"SSH_USER": "<SSH_USER>",
"SSH_PASSWORD": "<SSH_PASSWORD>",
"SSH_PORT": "<SSH_PORT>"
}
}
}
}
起動コマンドuvx ssh-licco
設定が必要な環境変数
SSH_HOSTSSH server hostname or IP address
SSH_USERSSH username for authentication
SSH_PASSWORDシークレットSSH password for authentication
SSH_PORTSSH port number

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypissh-licco2.7.3

ツール

9

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
hoststringいいえSSH サーバーのホスト名または IP。省略すると、環境変数または保存済みの設定から自動的に読み込みます。
namestringいいえ名前を指定して hosts.json の事前設定済みホストを使用します。
portintegerいいえSSH ポート
commandstringいいえ接続直後に実行する任意のコマンド。
passwordstringいいえパスワード認証に使用する SSH パスワード。
usernamestringいいえSSH ユーザー名。省略すると、環境変数から自動的に読み込みます。
passphrasestringいいえ暗号化された秘密鍵のパスフレーズ。
auth_methodenumいいえ認証方式。password | private_key | agent
save_configbooleanいいえ接続設定をローカル設定ファイルに保存し、今後使用できるようにします。
sudo_passwordstringいいえSudo パスワード(任意)。設定すると、ssh_execute で use_sudo=true を指定した際に、コマンドを sudo -S で自動的にラップし、プロセス一覧にパスワードが平文で表示されるのを防ぎます。
private_key_pathstringいいえ鍵認証に使用する秘密鍵ファイルのパス。
accept_new_host_keybooleanいいえ新しいホスト鍵を自動的に受け入れます。

詳細

🚀 SSH LICCO

PyPI version Python 3.10+ License: MIT MCP Registry

AI にサーバー操作を任せましょう! 自然言語で会話するだけで、AI がコマンドの実行、ファイルの管理、ログの確認、アプリケーションのデプロイなどを支援します。


📚 ドキュメント案内

クイックスタート
主な機能
高度なトピック
開発リソース

✨ 主な特長

  • 🎯 自然言語による操作 - 会話形式でサーバーを操作
  • 🔐 複数の認証方式 - パスワード、鍵、エージェント転送
  • 🔗 長時間接続に対応 - 自動キープアライブ(30 秒間隔のハートビート)でアカウントのロックを防止
  • ⏱️ タイムアウトを設定可能 - バナーのタイムアウト(60 秒)、セッションのタイムアウト(2 時間)に対応し、自動再接続も可能
  • 📦 高性能な非同期処理 - Paramiko に基づく非同期アーキテクチャ(スレッドプール + asyncio)
  • 🛡️ 充実した例外処理 - 統一されたエラー処理機構(7 層の例外階層)
  • 📊 セッション管理 - 複数の SSH セッションを同時に利用可能(最大 10 件、1 ホストあたり 3 件)
  • 📁 SFTP ファイル転送 - アップロード、ダウンロード、ディレクトリ管理
  • 🖊️ リモートファイル編集 - ダウンロードして再アップロードすることなく、ファイルの内容を直接書き込み/追記
  • 🔑 鍵管理 - SSH 鍵ペア(RSA/Ed25519)の生成と管理
  • 📝 監査ログ - 操作を完全に記録する監査ログ(JSON 構造化ログ)
  • 🚀 接続プール - 高性能な接続の再利用(PooledConnection + ConnectionPool)
  • 📊 一括実行 - 複数ホストでコマンドを並列実行(BatchExecutor + AsyncBatchExecutor)
  • 🐳 Docker 対応 - Docker のビルドと状態監視
  • 📋 バックグラウンドタスク - 信頼性の高いバックグラウンドプロセスの起動(nohup + bash -c によるラップ。単一の SSH 呼び出しで競合状態を回避)
  • 🖥️ screen/tmux セッション - 永続的なリモートセッションにより、SSH 切断後もプロセスが稼働
  • 🪟 Windows サーバー対応 - Windows Server(OpenSSH for Windows)および Linux/macOS のターゲットホストに対応
  • 🔍 プロセス管理 - リモートプロセスの起動/停止/照会、SSH ポート転送(トンネル)
  • 🔍 ウォッチドッグ - タスク監視、ハートビート検出、グローバル例外処理
  • 🛡️ ファイル転送パスの安全性検証 - ssh_file_transfer の delete では Windows/Unix のパス形式を自動判別し、機密性の高いパスとパストラバーサルを遮断

🖥️ ターゲットホストの対応状況

SSH-LICCO は標準の SSH/SFTP プロトコルに基づいており、以下のターゲットホストに接続できます。

OS要件備考
LinuxOpenSSH 7.0+推奨。すべての機能に完全対応
Windows ServerOpenSSH for Windows / PowerShell Remoting over SSHv2.1.3+ では Windows のパス形式と安全性検証に対応
macOSシステム標準の OpenSSH完全対応

ヒント:Windows サーバーに接続する場合は、Windows 形式のパス(例:C:\temp\file.txt)を使用してください。システムが自動的に形式を判別し、パスの安全性を検証します。


📦 クイックインストール

方法 1:pip でインストール(推奨)
pip install ssh-licco
方法 2:ソースからインストール
git clone https://github.com/Echoqili/ssh-licco.git
cd ssh-licco
pip install -e .

Python の要件: Python 3.10+


🚀 クイックスタート

1️⃣ MCP サーバーを設定する
Trae/Cursor/Claude Desktop で使用する場合

設定を開き → MCP → 新しいサーバーを追加します。

{
  "mcpServers": {
    "ssh": {
      "command": "python -m ssh_mcp.server"
    }
  }
}
2️⃣ SSH 接続を設定する(任意ですが推奨)
方法 A:環境変数による設定(推奨)
{
  "mcpServers": {
    "ssh": {
      "command": "python -m ssh_mcp.server",
      "env": {
        "SSH_HOST": "192.168.1.100",
        "SSH_USER": "root",
        "SSH_PASSWORD": "your_password",
        "SSH_PORT": "22",
        "SSH_TIMEOUT": "60",
        "SSH_KEEPALIVE_INTERVAL": "30",
        "SSH_SESSION_TIMEOUT": "7200",
        "SSH_CLIENT_TYPE": "common"
      }
    }
  }
}

環境変数の説明:

  • SSH_HOST:SSH サーバーのアドレス
  • SSH_USER:ユーザー名
  • SSH_PASSWORD:パスワード
  • SSH_PORT:ポート(デフォルトは 22)
  • SSH_TIMEOUT:接続タイムアウト(秒)
  • SSH_KEEPALIVE_INTERVAL:キープアライブ間隔(秒)
  • SSH_SESSION_TIMEOUT:セッションのタイムアウト(秒)
  • SSH_CLIENT_TYPE:SSH クライアントの種類(任意。デフォルトは common)
    • common - paramiko(安定性と信頼性に優れています。推奨)⭐
    • performance - asyncssh(高性能で、高並行処理に適しています)🚀
    • development - fabric(シンプルな API で、迅速な開発に適しています)👨‍💻

🔐 セキュリティ設定

新しい強化済みデフォルト値と移行に関する説明は、セキュリティ境界と強化設定 をご覧ください。 接続時にはデフォルトでホスト鍵が検証され、確認パラメーターによるコマンドポリシーの回避はできなくなりました。また、ファイル転送の実行ディレクトリは分離されています。 以下の表はプロジェクトのモードを説明するものであり、サードパーティープラットフォームのセキュリティ評価ではありません。

重要:v0.2.1 以降、ssh-licco では複数段階のセキュリティポリシーを利用でき、用途に応じて柔軟に設定できます。

複数段階のセキュリティポリシー
レベル名称用途保護強度
STRICT厳格モード本番環境、パブリックサーバー最高 ⭐⭐⭐
BALANCEDバランスモード開発環境、個人用サーバー(デフォルト)高 ⭐⭐
RELAXED緩和モードテスト環境、完全に信頼できるサーバー中 ⭐
クイック設定
方法 1:環境変数(推奨)

Windows PowerShell:

$env:SSH_SECURITY_LEVEL = "balanced"
$env:SSH_EXTRA_ALLOWED_COMMANDS = "git,pip,npm"

Linux/Mac:

export SSH_SECURITY_LEVEL="balanced"
export SSH_EXTRA_ALLOWED_COMMANDS="git,pip,npm"
方法 2:MCP 設定ファイル
{
  "mcpServers": {
    "ssh": {
      "command": "python -m ssh_mcp.server",
      "env": {
        "SSH_SECURITY_LEVEL": "balanced",
        "SSH_EXTRA_ALLOWED_COMMANDS": "git,pip,npm",
        "SSH_BASE_DIR": "/home"
      }
    }
  }
}
📖 詳細ドキュメント
🛡️ 硬拦截灾难性命令(v2.2.0 新增)

为防止任何误操作或越权调用直接打到远程 shell,ssh-licco 在所有安全级别下都无条件拦截以下灾难性命令模式,无法通过 confirm_dangerous=true、confirmation_layer=N、调整 SSH_SECURITY_LEVEL 等任何方式绕过:

  • rm -rf 作用于绝对路径(含 /、/*、/path、/path/*,-fr 变体同效)
  • mkfs.* 任意文件系统格式化
  • dd if=/dev/(zero|random|urandom) of=/dev/(sd|nvme) 覆写裸盘
  • bash fork-bomb(:(){ :|:& };: 及空白变体)
  • chmod -R 777 / / chmod -R 000 / 根目录递归改权限
  • > /dev/(sd|nvme) / >> /dev/(sd|nvme) 裸设备重定向

如确需执行上述操作,请直接通过 SSH 登录服务器(绕过 MCP 网关)进行。安全且可逆的替代方案:

# 旧做法(v2.2.0 之前):rm -rf /path/to/junk  ← 现已被硬拦截
# 推荐做法:mv 到回收站,约定时间后清理
mv /path/to/junk /tmp/.trash_$(date +%s)/

命中硬拦截时会输出 WARNING 审计日志(含 category 与命令),便于 SOC 监控。


🛠️ 可用工具(v2.2.0 维持 9 个;v2.1.0 曾增加的 3 个审批工具因流程闭环风险已下线)

工具描述核心能力
ssh_connect连接管理自动读取环境变量/配置,支持密码+密钥认证,可保存配置,登录后自动执行命令
ssh_execute命令执行自动连接、智能后台检测、长任务等待、超时控制,支持 nohup/screen/tmux 三种后台模式;v2.2.0 起对灾难性命令(rm -rf 绝对路径、mkfs、raw-disk dd、fork-bomb 等)做无条件硬拦截
ssh_disconnect会话管理断开指定会话 OR 列出所有活跃会话
ssh_file_transfer文件传输上传/下载/列表/写入/追加/删除/创建目录/查看元信息(8 种操作);v2.1.3+ delete 操作新增 Windows/Unix 敏感路径拦截与路径遍历防护
ssh_host主机管理action=list/add/remove 增删查主机配置
ssh_dockerDocker 管理action=ps/images/build/logs 全生命周期管理
ssh_generate_key密钥生成RSA / Ed25519 密钥对
ssh_sessionscreen/tmux 会话持久化远程会话管理(create/send/capture/list/kill),SSH 断开后进程依然存活
ssh_process进程管理启动/停止/查询远程进程,SSH 端口转发(tunnel_open/tunnel_close/tunnel_list)

关于 v2.1.0 引入的 3 个审批工具(ssh_request_approval / ssh_approve_command / ssh_list_approvals):已从 MCP list_tools() 移除,代码已在 v2.2.0 删除(ssh_mcp/approval.py、ssh_mcp/handlers/approval.py)。审批流程依赖 AI 自报命令、运维侧背书,存在闭环风险;v2.2.0 的硬拦截更直接——灾难性命令在 MCP 网关层就被拒绝,运维侧不需要再走"先申请再审批"流程。

📖 详细文档

💡 使用示例

示例 1:执行命令
用户:帮我查看服务器上的 Docker 容器
AI:调用 ssh_connect → ssh_execute "docker ps"

[执行结果]
CONTAINER ID   IMAGE     COMMAND   STATUS   PORTS
abc123         nginx     "nginx"   Up 2 days 80:80
示例 2:文件上传
用户:把这个文件上传到 /var/www/html
AI:调用 ssh_connect → ssh_file_transfer

[上传成功]
本地:./index.html
远程:/var/www/html/index.html
大小:2.3 KB
示例 3:Docker 构建(长任务)
用户:帮我构建 Docker 镜像
AI:调用 ssh_execute(background=True) 后台执行 docker build...

[后台任务已启动]
Session ID: a1b2c3d4
命令:docker build -t myapp .
使用 ssh_execute(session_id="a1b2c3d4", command="cat /tmp/build.log") 查看进度
示例 4:数据库检查
用户:检查 PostgreSQL 是否正常运行
AI:调用 ssh_execute "pg_isready -h localhost -p 5432"

[检查结果]
localhost:5432 - accepting connections
✅ PostgreSQL 运行正常
📖 更多示例

📋 完整配置示例

场景 1:Web 开发者
{
  "mcpServers": {
    "ssh": {
      "command": "python -m ssh_mcp.server",
      "env": {
        "SSH_SECURITY_LEVEL": "balanced",
        "SSH_EXTRA_ALLOWED_COMMANDS": "git,npm,docker,composer,pm2",
        "SSH_BASE_DIR": "/var/www",
        "SSH_HOST": "192.168.1.100",
        "SSH_USER": "deploy",
        "SSH_PASSWORD": "your-password"
      }
    }
  }
}
场景 2:Python 开发者
{
  "mcpServers": {
    "ssh": {
      "command": "python -m ssh_mcp.server",
      "env": {
        "SSH_SECURITY_LEVEL": "balanced",
        "SSH_EXTRA_ALLOWED_COMMANDS": "pip,poetry,python3,pytest,black",
        "SSH_HOST": "192.168.1.100",
        "SSH_USER": "developer",
        "SSH_PASSWORD": "your-password"
      }
    }
  }
}
场景 3:数据库管理员
{
  "mcpServers": {
    "ssh": {
      "command": "python -m ssh_mcp.server",
      "env": {
        "SSH_SECURITY_LEVEL": "balanced",
        "SSH_EXTRA_ALLOWED_COMMANDS": "psql,mysql,mongosh,pg_isready",
        "SSH_HOST": "192.168.1.100",
        "SSH_USER": "dbadmin",
        "SSH_PASSWORD": "your-password"
      }
    }
  }
}
场景 4:系统管理员
{
  "mcpServers": {
    "ssh": {
      "command": "python -m ssh_mcp.server",
      "env": {
        "SSH_SECURITY_LEVEL": "relaxed",
        "SSH_EXTRA_ALLOWED_COMMANDS": "sudo,apt,yum,systemctl,journalctl,docker,kubectl",
        "SSH_HOST": "192.168.1.100",
        "SSH_USER": "root",
        "SSH_PASSWORD": "your-password"
      }
    }
  }
}
场景 5:生产环境(最高安全)
{
  "mcpServers": {
    "ssh": {
      "command": "python -m ssh_mcp.server",
      "env": {
        "SSH_SECURITY_LEVEL": "strict",
        "SSH_HOST": "192.168.1.100",
        "SSH_USER": "app-user",
        "SSH_PASSWORD": "your-password",
        "SSH_BASE_DIR": "/home/app-user"
      }
    }
  }
}
📖 更多配置
🌐 完整环境变量速查(v2.3.0)

下表所有变量均被代码读取。注意:

  • SSH_RATE_LIMIT 是 bool 总开关(true/false),SSH_RATE_LIMIT_MAX 才是次数上限,两者分开配置
  • 主机密钥检查(strict_host_key_checking)不通过 env 配置,请用 ssh_connect 工具参数或 hosts.json
分类变量默认说明
安全SSH_SECURITY_LEVELbalanced安全级别:strict / balanced / relaxed
SSH_BASE_DIR/homeUnix 远程 SFTP 路径校验基目录
SSH_LOCAL_BASE_DIR当前工作目录本地文件上传源与下载目标的允许目录
SSH_EXTRA_ALLOWED_COMMANDS(空)额外允许的命令(逗号分隔)
SSH_ALLOWED_COMMANDS_FILE(空)命令白名单 JSON 文件路径
SSH_AUDIT_LOG_PATH(空)审计日志文件路径
限流SSH_RATE_LIMITtrue限流总开关(bool)
SSH_RATE_LIMIT_MAX30限流次数上限
SSH_RATE_LIMIT_WINDOW60限流窗口(秒)
硬拦截(无 env)—灾难性命令硬拦截,零配置零绕过
连接默认SSH_HOST / SSH_PORT / SSH_USER / SSH_PASSWORD127.0.0.1 / 22 / root / (空)单 host 模式默认连接参数
SSH_TIMEOUT60连接超时(秒)
SSH_KEEPALIVE_INTERVAL30keepalive 间隔(秒)
SSH_SESSION_TIMEOUT7200会话超时(秒)
SSH_CLIENT_TYPEparamikoSSH 客户端实现:paramiko / asyncssh
SSH_FORCE_ENV_CONFIGfalse强制 env 配置覆盖 hosts.json
SSH_SUDO_PASSWORD(空)sudo 密码,配合 use_sudo=true 走 sudo -S

⚠️ 依赖版本兼容性

已知依赖冲突

以下依赖版本冲突已在测试环境中验证,不影响 ssh-licco 的正常使用:

1. starlette 版本冲突
fastapi 需要 starlette<0.51.0
但安装了 starlette 0.52.1

影响范围:

  • ✅ ssh-licco: 无影响,正常工作
  • ⚠️ fastapi: 可能存在兼容性问题(如果同时使用 fastapi)

解决方案:

  • 如果只使用 ssh-licco,可以忽略此警告
  • 如果同时使用 fastapi,建议:
    pip install starlette==0.50.0
    
2. cryptography 版本冲突
pyopenssl 需要 cryptography<45
但安装了 cryptography 46.0.5

影响范围:

  • ✅ ssh-licco: 无影响,正常工作
  • ⚠️ pyopenssl: 可能存在兼容性问题(如果同时使用 pyopenssl)

解决方案:

  • 如果只使用 ssh-licco,可以忽略此警告
  • 如果同时使用 pyopenssl,建议:
    pip install cryptography==44.0.0
    
测试环境

测试通过的配置:

  • ✅ starlette 0.52.1 + ssh-licco 0.4.1
  • ✅ cryptography 46.0.5 + ssh-licco 0.4.1
  • ✅ mcp 1.26.0 + ssh-licco 0.4.1

测试场景:

  • ✅ SSH 连接和执行命令
  • ✅ 文件上传和下载
  • ✅ 后台任务执行
  • ✅ Docker 构建和监控
  • ✅ 多语言后台命令自动检测
为什么允许这些冲突?

ssh-licco 的核心依赖是:

  • mcp - MCP 协议实现
  • asyncssh - SSH 客户端
  • paramiko - SSH 客户端(稳定模式)
  • pydantic - 数据验证

而 starlette 和 cryptography 是通过 mcp 间接引入的。ssh-licco 本身不直接使用这些库的 API,因此版本冲突不会影响 ssh-licco 的功能。


🔧 故障排查

常见问题
1. 连接失败

错误: Connection refused

解决:

  • 检查 SSH 服务是否运行:systemctl status sshd
  • 检查防火墙设置:ufw status
  • 确认端口正确:默认 22
2. 认证失败

错误: Authentication failed

解决:

  • 检查用户名和密码
  • 尝试使用密钥认证
  • 查看 SSH 日志:/var/log/auth.log
3. 命令被阻止

错误: 命令 'xxx' 不在允许列表中

解决:

{
  "SSH_SECURITY_LEVEL": "balanced",
  "SSH_EXTRA_ALLOWED_COMMANDS": "被阻止的命令"
}
📖 详细文档

🎓 学习资源

Skills 文档
配置文档
API 文档

🔗 相关链接

项目资源
文档索引
文档描述位置
📖 配置指南完整配置选项和场景MCP_CONFIG_GUIDE.md
🔐 安全指南安全配置详解SECURITY_CONFIG_GUIDE.md
📊 API 参考完整 API 文档docs/API_REFERENCE.md
🎓 Skills开发、运维、安装指南docs/skills/
📦 发布指南版本发布流程docs/skills/RELEASE_SKILL.md

🧪 测试

测试状态
指标状态
测试用例311 passed, 0 skipped
覆盖率16 个源模块全覆盖
测试框架pytest + pytest-asyncio
测试模块覆盖
源模块测试文件用例数
exceptions.pytest_exceptions.py7
connection_config.pytest_connection_config.py8
security.pytest_security.py24
logging_config.pytest_logging_config.py8
audit_logger.pytest_audit_logger.py12
executor.pytest_executor.py8
watchdog.pytest_watchdog.py18
key_manager.pytest_key_manager.py6
config_manager.pytest_config_manager.py10
clients/interface.pytest_factory.py10
clients/paramiko_client.pytest_paramiko_client.py18
clients/factory.pytest_factory.py10
session_manager.pytest_session_manager.py18
connection_pool.pytest_connection_pool.py10
batch_executor.pytest_batch_executor.py10
server.pytest_server.py30+
service.pytest_service.py14
运行测试
# 运行全部测试
pytest tests/ -v

# 运行特定模块测试
pytest tests/test_security.py -v

# 查看覆盖率
pytest --cov=ssh_mcp --cov-report=term-missing

📦 发布流程

先在独立分支同步版本并运行测试:

python sync_version.py 2.8.1 --no-commit --no-tag
python sync_version.py --check
python -m pytest tests -q
node --test tests/install.test.cjs

代码合并后推送 vX.Y.Z 标签,现有发布流程依次执行版本校验、测试、打包、 PyPI 上传、公开安装源码核验,再创建或补齐 GitHub Release。 不需要向 npm 注册表发布;Node 安装包通过 GitHub Release 下载。

支持手动只验证,以及针对原标签恢复中断的发布。网络查询失败时停止上传; 已有 PyPI 文件和 Release 安装包不会重复覆盖。 详细操作及凭据配置见 发布与失败恢复。


📊 版本历史

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。