Skip to main content
Glama
vait90
by vait90

SSH MCP 서버 (paramiko)

Paramiko 기반 SSH MCP 서버로, 원격 머신에서 명령을 실행하고 SFTP를 통해 파일을 이동할 수 있습니다. 환경 변수 / 스위치로 선택할 수 있는 두 가지 transport 방식으로 제공됩니다:

  • http/mcp 경로의 MCP streamable-http 엔드포인트 (Cherry Studio가 등록됨), 그리고 문서화된 OpenAPI/Swagger 인터페이스 (/docs, /openapi.json).

  • stdio – 고전적인 MCP stdio transport (로컬 실행 / docker exec용).

포트에 대한 중요한 사항: 2222은 Cherry Studio가 연결하는 MCP 서버의 포트입니다. 이것은 원격 머신의 SSH 포트가 아닙니다! 원격 머신의 SSH 포트는 일반적으로 22(SSH_PORT)입니다. 즉: Cherry Studio → http://<host-IP>:2222/mcp → MCP 서버 → paramiko → 원격 머신의 22 SSH 포트.


사용 가능한 MCP 도구

상태 비저장(stateless) 도구 — 간단하고 일회성 작업

도구

설명

ssh_test

원격 머신과의 연결 및 인증 테스트.

ssh_execute

단 하나의 셸 명령을 새 연결으로 실행 (stdout / stderr / exit code). 메모리 없음: cd / export는 다음 호출에 **상속되지 **으며, 대화형 프롬프트에 응답할 수 없습니다.

ssh_upload

로컬 파일을 SFTP로 원격 머신에 업로드.

ssh_download

원격 머신에서 SFTP로 파일을 다운로드.

상태 저장(stateful) 대화형 세션 도구 — 살아 있는 셸

이들은 살아 있는 셸을 열어두고, 호출 사이에도 상태가 유지됩니다 (cd 이후 디렉터리 변경, export된 변수, 대화형 프롬프트 처리: sudo 비밀번호, apt [Y/n] 등).

도구

설명

ssh_open_session

1단계 – 새 대화형 셸을 열고 session_id를 반환합니다.

ssh_send

2단계 – 텍스트(명령 또는 프롬프트 응답)를 세션에 보냅니다. session_id항상 반드시 전달해야 합니다.

ssh_read

3단계 (선택) – 보내지 않고 추가 출력을 읽습니다 (느리거나 오래 걸리는 명령용).

ssh_close_session

4단계 – 세션을 닫습니다. 작업을 마쳤으면 항상 닫으세요.

ssh_list_sessions

열려 있는 세션을 나열합니다 (host, 사용자, 유휴 상태). 예: session_id를 잃어버린 경우.

도구 설명(docstring)은 의도적으로 매우 상세하면서도 간단한 영어 "USE THIS WHEN..." 가이드를 포함하고 있어, 소비 모델이 각 도구를 언제 그리고 어떻게 사용하는지 분명하게 알 수 있습니다.

모든 도구 파라미터 (host, port, username, password, private_key, private_key_path, passphrase, timeout)는 다음 중 하나로 지정할 수 있습니다:

  • 호출마다 개별적으로, 또는

  • 기본값으로 .env 파일에서 (SSH_* 변수). 호출에서 지정되지 않은 것은 시스템이 SSH_* 환경변수에서 가져옵니다.

지원 인증: 비밀번호 (인라인 PEM 또는 파일 경로, 선택적으로 비밀번호). 알 수없는 호스트 키는 서버가 자동으로 수용합니다 (AutoAddPolicy), 그래서 자동화가 매끄럽게 동작합니다.


Related MCP server: SSH MCP Server

상태 비저장(stateless) vs. 상태 유지(stateful, interactive) 사용

언제 어떤 것을?

  • 하나의 독립적인 명령 (예: ls, uptime, df -h) → ssh_execute. 호출마다 새 연결을 열고, 명령 하나를 실행한 다음 닫습니다. 메모리가 없습니다: cdexport는 다음 호출까지 유지되지 않으며, 대화형 프롬프트에 응답할 수 없습니다.

  • 대화형이거나 여러 단계가 필요한 경우 (cd/export 후 상태 유지, sudo 비밀번호 입력, apt [Y/n] 응답, 단계에 이어지는 명령) → 대화형 세션: ssh_open_sessionssh_sendssh_readssh_close_session.

권장 워크플로우 (세션)

  1. ssh_open_sessionsession_id를 받습니다 (입력 배너 / 첫 프롬프트는 initial_output에 포함).

  2. ssh_send → 명령을 입력하거나 프롬프트에 응답합니다. session_idsession_id반드시 전달해야 합니다. 기본적으로 Enter을 보냅니다.

  3. ssh_read (선택) → 느리거나 오래 걸리는 명령에서 전송 없이 추가 출력을 수집합니다.

  4. ssh_close_session → 모든 작업이 끝나면 세션을 닫습니다.

ssh_list_sessions로 언제든 열린 세션 (host, 사용자, 유휴 상태)을 확인할 수 있으며, 이때 session_id를 잃어버린 경우에도 확인할 수 있습니다.

예시 (REST 엔드포인트 이용)

세션 열기:

curl -X POST http://localhost:2222/api/ssh/session/open \
  -H "Content-Type: application/json" \
  -d '{"host":"192.168.1.100","username":"user","password":"secret"}'
# -> {"ok":true,"session_id":"<ID>", "initial_output":"...prompt..."}

디렉터리 변경 유지 (상태 저장):

curl -X POST http://localhost:2222/api/ssh/session/send \
  -H "Content-Type: application/json" \
  -d '{"session_id":"<ID>","input":"cd /var/log && pwd"}'
# a következő ssh_send már a /var/log-ban futna

sudo 명령 + 비밀번호 프롬프트 응답:

# 1) elindítod a sudo parancsot
curl -X POST http://localhost:2222/api/ssh/session/send \
  -H "Content-Type: application/json" \
  -d '{"session_id":"<ID>","input":"sudo apt-get update"}'
# 2) a kimenetben megjelenik a "[sudo] password for user:" prompt -> beküldöd a jelszót
curl -X POST http://localhost:2222/api/ssh/session/send \
  -H "Content-Type: application/json" \
  -d '{"session_id":"<ID>","input":"my_sudo_password"}'

apt [Y/n] 질문에 응답:

curl -X POST http://localhost:2222/api/ssh/session/send \
  -H "Content-Type: application/json" \
  -d '{"session_id":"<ID>","input":"sudo apt-get install htop","read_timeout":5}'
# amikor jön a "Do you want to continue? [Y/n]" kérdés:
curl -X POST http://localhost:2222/api/ssh/session/send \
  -H "Content-Type: application/json" \
  -d '{"session_id":"<ID>","input":"Y"}'

세션 닫기:

curl -X POST http://localhost:2222/api/ssh/session/close \
  -H "Content-Type: application/json" \
  -d '{"session_id":"<ID>"}'

타임아웃 / 유휴 / 오류: 모든 세션 조작은 SSH_SESSION_IDLE_TIMEOUT(기본 600초) 보다 오래 유휴된 세션, 그리고 채널이 끊어진 세션을 자동으로 닫습니다. 동시에 최대 SSH_MAX_SESSIONS(기본 20개) 개의 세션을 동시에 열 수 있고, 한도에 도달하면 명확한 오류 메시지를 반환합니다. 어떤 session_id가 더 이상 존재하지 않으면, 응답은 정확히 무엇을 해야 하는지 (새 세션을 열거나 ssh_list_sessions 확인) 알려줍니다.


프로젝트 구조

ssh-mcp-server/
├── app/
│   ├── __init__.py
│   ├── ssh_ops.py     # paramiko SSH/SFTP műveletek (közös logika)
│   └── server.py      # MCP tool-ok + FastAPI/OpenAPI + transport választás
├── requirements.txt
├── Dockerfile
├── docker-compose.yml # 2222:2222 publikálás
├── .env.example
└── README.md

1. Docker로 빠른 시작 (권장)

준비

cd ssh-mcp-server
cp .env.example .env
# szerkeszd a .env-et: add meg a távoli gép adatait (SSH_HOST, SSH_USERNAME, stb.)

빌드 및 실행 (HTTP 모드)

docker compose up -d --build

이 방법으로 서버를 HTTP 모드로 시작하고, 2222 포트를 호스트에 출판합니다 (ports: "2222:2222").

확인

curl http://localhost:2222/health
# {"status":"ok","service":"ssh-mcp-server","mcp_endpoint":"/mcp"}
  • Swagger UI (브라우저): http://localhost:2222/docs

  • OpenAPI JSON: http://localhost:2222/openapi.json

  • MCP 엔드포인트 (Cherry Studio): http://<host-IP>:2222/mcp

중지

docker compose down

2. HTTP 모드 수동 실행 (Docker 없이, 개발용)

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
export TRANSPORT=http HOST=0.0.0.0 PORT=2222
python -m app.server

3. stdio 모드

컨테이너에서 실행 중인 서버일 경우 docker exec로:

docker exec -i -e TRANSPORT=stdio ssh-mcp-server python -m app.server

또는 Docker 없이 직접 실행:

TRANSPORT=stdio python -m app.server

4. Cherry Studio 통합

A) HTTP (streamable-http) 모드 – 권장, 네트워크를 통해 작동

컨테이너가 노트북의 Docker에서 실행되고, Cherry Studio는 호스트 IP2222 포트를 사용합니다.

  1. 서버를 시작한다: docker compose up -d --build

  2. Docker가 실행되는 컴퓨터(호스트)의 IP 주소를 확인한다:

    • Linux: hostname -I → 예: 192.168.1.50

    • Cherry Studio가 동일한 컴퓨터에서 실행되고 있다면 localhost / 127.0.0.1도 사용 가능.

  3. Cherry Studio → 설정 (Settings)MCP ServersAdd / 새 서버.

  4. 다음을 설정한다:

    • Type / Típus: Streamable HTTP (없으면 SSE/HTTP`)

    • URL / 엔드포인트: http://<host-IP>:2222/mcp

      • 예: http://192.168.1.50:2222/mcp

      • 원격이면: http://localhost:2222/mcp

  5. 저장하고 활성화(Enable) 한다. Cherry Studio가 ssh_test, ssh_execute, ssh_upload, ssh_download 도구들을 로드합니다.

원격 컴퓨터에서 연결하는 경우, 2222 포트에 접근 가능하지(방화벽 허용) 확인하고, Docker가 0.0.0.0으로 바인딩하고 있는지(기본적으로) 확인하세요.

B) stdio 모드

Cherry Studio가 stdio MCP 서버(명령을 실행)를 기대하는 경우:

  • Command: docker

  • Arguments:

    exec -i -e TRANSPORT=stdio ssh-mcp-server python -m app.server

(위한 ssh-mcp-server 컨테이너가 실행 중이어야 합니다 — docker compose up -d.)


5. .env 설정

변수

설명

기본값

TRANSPORT

http 또는 stdio

http

HOST

MCP HTTP 바인딩 주소

0.0.0.0

PORT

MCP HTTP 포트 (Cherry Studio에서 연결)

2222

SSH_HOST

원격 컴퓨터 주소

SSH_PORT

원격 컴퓨터 SSH 포트

22

SSH_USERNAME

SSH 사용자

SSH_PASSWORD

SSH 비밀번호 (또는 키 인증)

SSH_PRIVATE_KEY

인라인 개인키 (PEM)

SSH_PRIVATE_KEY_PATH

개인키 파일 경로 (컨테이너 안)

SSH_PASSPHRASE

개인키 암호

SSH_TIMEOUT

연결 타임아웃 (초)

15

SSH_SESSION_IDLE_TIMEOUT

N초 동안 유휴된 대화형 세션 자동 닫기 (0 = off)

600

SSH_MAX_SESSIONS

동시에 열 수 있는 최대 대화형 세션 수

20

Docker에서 키 인증

키를 컨테이너에 마운트하고 경로를 설정합니다. docker-compose.yml에서 volumes 줄의 주석을 제거합니다:

    volumes:
      - ./keys:/keys:ro

그 다음 .env에:

SSH_PRIVATE_KEY_PATH=/keys/id_ed25519

6. 테스트 REST 엔드포인트 (OpenAPI)

HTTP 형식은 Cherry Studio MCP 엔드포인트 옆에 REST 엔드포인트를 제공합니다 — 동일한 SSH 작업을 수행하며 curl / Swagger UI에서 사용하기 쉽습니다:

메서드

경로

동작

GET

/health

상태

GET

/

서버 정보

POST

/api/ssh/test

연결 테스트

POST

/api/ssh/execute

명령 실행

POST

/api/ssh/upload

파일 업로드 (SFTP)

POST

/api/ssh/download

파일 다운로드 (SFTP)

POST

/api/ssh/session/open

대화형 세션 열기 (1단계)

POST

/api/ssh/session/send

세션에 입력 전송 (2단계)

POST

/api/ssh/session/read

전송 없이 출력 읽기 (3단계)

POST

/api/ssh/session/close

세션 닫기 (4단계)

GET

/api/ssh/session/list

열린 세션 목록

예제 (상태 저장되지 않은 단일 명령):

curl -X POST http://localhost:2222/api/ssh/execute \
  -H "Content-Type: application/json" \
  -d '{"host":"192.168.1.100","username":"user","password":"secret","command":"uname -a"}'

리피코어 노트

  • 코드에는 비밀이 절대 없다 — 모든 것을 .env 또는 호출 매개변수에서 읽습니다.

  • .env 파일은 .dockerignore 및 일반적으로 .gitignore가 배제할 수 있습니다 — 버전 관리에 커밋하지 마세요.

  • 서버는 AutoAddPolicy를 사용합니다(알 수 없는 호스트 키 자동 수락). 폐쇄 네트워크에서는 편리; 엄격한 환경에서는 알려진 호스트 키를 사용하는 것이 좋습니다.

  • 2222 MCP 포트는 신뢰할 수 있는 네트워크에서만 접근을 허용하세요.

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to securely execute commands, transfer files, and manage port forwarding on remote servers via SSH.
    98
    36
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables remote server management via SSH, including command execution, file transfer (SFTP), and interactive shell sessions, with support for multiple hosts.
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to securely execute commands on remote hosts via SSH and SFTP, with persistent shells, file transfers, screenshots, and an audit log.
    1
    MIT

View all related MCP servers

Related MCP Connectors

  • Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.

  • Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.

  • Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vait90/ssh-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server