-
Notifications
You must be signed in to change notification settings - Fork 6
14 FAQ
Purpose: Answer common questions about MCP SSH Orchestrator, its usage, configuration, and troubleshooting.
This FAQ addresses the most frequently asked questions about MCP SSH Orchestrator, covering installation, configuration, security, and troubleshooting.
MCP SSH Orchestrator is a secure SSH fleet orchestrator built as a Model Context Protocol (MCP) server. It enables AI agents and other MCP clients to execute commands across a fleet of SSH targets with robust policy-based access control, network filtering, and comprehensive audit logging.
AI agents interacting with external systems introduce significant security risks, including prompt injection, data exfiltration, and privilege escalation. mcp-ssh-orchestrator acts as a secure gateway, mediating all agent-to-SSH interactions through a hardened policy engine, ensuring only authorized and safe commands are executed.
Direct SSH Access:
- No policy enforcement
- No audit logging
- No network filtering
- No rate limiting
- No compliance reporting
mcp-ssh-orchestrator:
- Policy-based access control
- Comprehensive audit logging
- Network security filtering
- Rate limiting and timeouts
- Compliance reporting
- MCP protocol integration
- Claude Desktop: Primary integration target
- OpenAI Codex: Via Docker MCP Toolkit
- Custom Applications: Using MCP SDKs
- Development Tools: IDEs and editors with MCP support
Docker (Recommended):
# Pull the image
docker pull ghcr.io/samerfarida/mcp-ssh-orchestrator:latest
# Run with configuration
docker run -i --rm \
-v ~/mcp-ssh/config:/app/config:ro \
-v ~/mcp-ssh/keys:/app/keys:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latestFrom Source:
git clone https://github.com/samerfarida/mcp-ssh-orchestrator.git
cd mcp-ssh-orchestrator
pip install -e .Minimum Requirements:
- Docker 20.10+ or Python 3.11+
- 512MB RAM
- 1GB disk space
- SSH client
Recommended Requirements:
- Docker 24.0+
- 2GB RAM
- 10GB disk space
- Modern CPU with 2+ cores
macOS Configuration (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"ssh-orchestrator": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/Users/YOUR_USERNAME/mcp-ssh/config:/app/config:ro",
"-v", "/Users/YOUR_USERNAME/mcp-ssh/keys:/app/keys:ro",
"ghcr.io/samerfarida/mcp-ssh-orchestrator:latest"
]
}
}
}Windows Configuration (%APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"ssh-orchestrator": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "C:\\Users\\YOUR_USERNAME\\mcp-ssh\\config:/app/config:ro",
"-v", "C:\\Users\\YOUR_USERNAME\\mcp-ssh\\keys:/app/keys:ro",
"ghcr.io/samerfarida/mcp-ssh-orchestrator:latest"
]
}
}
}1. Generate SSH key pair:
ssh-keygen -t ed25519 -f ~/mcp-ssh/keys/id_ed25519 -C "mcp-ssh-orchestrator"2. Set permissions:
chmod 0400 ~/mcp-ssh/keys/id_ed25519
chmod 0444 ~/mcp-ssh/keys/id_ed25519.pub3. Deploy public key:
ssh-copy-id -i ~/mcp-ssh/keys/id_ed25519.pub ubuntu@10.0.0.114. Update credentials.yml:
entries:
- name: "admin"
username: "ubuntu"
key_path: "id_ed25519"
key_passphrase_secret: ""
password_secret: ""Basic Policy Configuration:
# policy.yml
known_hosts_path: "/app/keys/known_hosts"
limits:
max_seconds: 30
max_output_bytes: 131072
host_key_auto_add: false
require_known_host: true
rules:
- action: "allow"
aliases: ["web1", "web2"]
tags: ["production"]
commands:
- "uptime*"
- "df -h*"
- "systemctl status *"
- action: "deny"
aliases: ["*"]
tags: ["*"]
commands:
- "rm -rf *"
- "shutdown*"
- "reboot*"1. Update servers.yml:
entries:
- alias: "web1"
hostname: "10.0.0.11"
port: 22
tags: ["production", "web"]
- alias: "web2"
hostname: "10.0.0.12"
port: 22
tags: ["production", "web"]2. Add host keys:
ssh-keyscan 10.0.0.11 >> ~/mcp-ssh/keys/known_hosts
ssh-keyscan 10.0.0.12 >> ~/mcp-ssh/keys/known_hosts3. Test connectivity:
ssh -i ~/mcp-ssh/keys/id_ed25519 ubuntu@10.0.0.11Yes, mcp-ssh-orchestrator implements multiple security layers:
Policy Enforcement:
- Command allow/deny rules
- Network filtering (CIDR allowlists/blocklists)
- Rate limiting and timeouts
- Host key verification
Audit & Compliance:
- Comprehensive audit logging
- Policy violation tracking
- Security event monitoring
- Compliance reporting
Container Security:
- Non-root execution
- Read-only filesystem
- Resource limits
- Network isolation
Docker Secrets (Recommended):
# Create secrets
echo "your-passphrase" | docker secret create mcp_key_passphrase -
echo "your-password" | docker secret create mcp_password -
# Use in Docker Compose
services:
mcp-ssh:
image: ghcr.io/samerfarida/mcp-ssh-orchestrator:latest
secrets:
- mcp_key_passphrase
- mcp_passwordEnvironment Variables:
# Set environment variables
export MCP_SSH_SECRET_KEY_PASSPHRASE="your-passphrase"
export MCP_SSH_SECRET_PASSWORD="your-password"
# Use in Docker run
docker run -i --rm \
-e MCP_SSH_SECRET_KEY_PASSPHRASE \
-e MCP_SSH_SECRET_PASSWORD \
-v ~/mcp-ssh/config:/app/config:ro \
-v ~/mcp-ssh/keys:/app/keys:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latest1. Collect host keys:
ssh-keyscan 10.0.0.11 >> ~/mcp-ssh/keys/known_hosts
ssh-keyscan 10.0.0.12 >> ~/mcp-ssh/keys/known_hosts2. Update policy:
# policy.yml
known_hosts_path: "/app/keys/known_hosts"
require_known_host: true
host_key_auto_add: false3. Test verification:
ssh -i ~/mcp-ssh/keys/id_ed25519 ubuntu@10.0.0.11Via Claude Desktop:
Execute the command "uptime" on the production web server
Via MCP Client:
result = await session.call_tool(
"ssh_run",
{"alias": "web1", "command": "uptime"}
)Via Docker:
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"ssh_run","arguments":{"alias":"web1","command":"uptime"}},"id":1}' | \
docker run -i --rm \
-v ~/mcp-ssh/config:/app/config:ro \
-v ~/mcp-ssh/keys:/app/keys:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latestVia Claude Desktop:
List all available SSH hosts
Via MCP Client:
result = await session.call_tool("ssh_list_hosts", {})Via Docker:
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"ssh_list_hosts","arguments":{}},"id":1}' | \
docker run -i --rm \
-v ~/mcp-ssh/config:/app/config:ro \
-v ~/mcp-ssh/keys:/app/keys:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latestDry Run:
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"ssh_plan","arguments":{"alias":"web1","command":"uptime"}},"id":1}' | \
docker run -i --rm \
-v ~/mcp-ssh/config:/app/config:ro \
-v ~/mcp-ssh/keys:/app/keys:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latestPolicy Validation:
docker run --rm \
-v ~/mcp-ssh/config:/app/config:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latest \
python -c "
from mcp_ssh.policy import Policy
policy = Policy('/app/config/policy.yml')
print('Policy valid:', policy.validate())
"Common Causes:
- Command not in allow list
- Host not in allow list
- Policy rule violation
- Network filtering
Debug Steps:
# Check policy evaluation
docker run --rm \
-v ~/mcp-ssh/config:/app/config:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latest \
python -c "
from mcp_ssh.policy import Policy
policy = Policy('/app/config/policy.yml')
result = policy.evaluate('web1', 'uptime', ['production'])
print('Policy result:', result)
"
# Test with dry run
echo '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"ssh_plan","arguments":{"alias":"web1","command":"uptime"}},"id":1}' | \
docker run -i --rm \
-v ~/mcp-ssh/config:/app/config:ro \
-v ~/mcp-ssh/keys:/app/keys:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latestCommon Causes:
- Wrong SSH key
- Host not reachable
- SSH service not running
- Host key verification failed
Debug Steps:
# Test SSH connectivity
ssh -i ~/mcp-ssh/keys/id_ed25519 ubuntu@10.0.0.11
# Check host key
ssh-keyscan 10.0.0.11
# Test network connectivity
ping 10.0.0.11
telnet 10.0.0.11 22Common Causes:
- Configuration errors
- Permission issues
- Resource limits
- Missing dependencies
Debug Steps:
# Check container logs
docker logs $(docker ps -q --filter "ancestor=ghcr.io/samerfarida/mcp-ssh-orchestrator:latest")
# Test container health
docker run --rm ghcr.io/samerfarida/mcp-ssh-orchestrator:latest python -c "import mcp_ssh; print('OK')"
# Validate configuration
docker run --rm \
-v ~/mcp-ssh/config:/app/config:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latest \
python -c "
from mcp_ssh.config import Config
config = Config('/app/config')
print('Config valid:', config.validate())
"Current Limits:
- 100 concurrent SSH connections
- 1000 commands per minute
- 1MB output per command
- 30-second timeout per command
Resource Optimization:
- Container resource limits (memory, CPU)
- Connection timeout configuration
- Output size limits
- Performance monitoring via audit logs
Configuration Optimization:
# policy.yml
limits:
max_seconds: 15 # Shorter timeout for sensitive hosts
max_output_bytes: 65536 # Tighter output cap
task_result_ttl: 120 # Reduce async retention windowDocker Optimization:
# Increase container resources
docker run -i --rm \
--memory=1g \
--cpus=2 \
-v ~/mcp-ssh/config:/app/config:ro \
-v ~/mcp-ssh/keys:/app/keys:ro \
-v ~/mcp-ssh/secrets:/app/secrets:ro \
ghcr.io/samerfarida/mcp-ssh-orchestrator:latestNetwork Optimization:
# servers.yml
hosts:
- alias: "web1"
host: "10.0.0.11"
port: 22
credentials: "prod-admin"
tags: ["production", "web"]Documentation:
- This wiki for comprehensive guides
- GitHub README for quick start
-
examples/directory for ready-to-edit YAML
Community:
- GitHub Discussions for questions
- GitHub Issues for bugs or feature requests
Professional Support:
- Not offered. This is a community-supported Apache-2.0 project.
Bug Report Template:
## Bug Description
Brief description of the bug
## Steps to Reproduce
1. Step one
2. Step two
3. Step three
## Expected Behavior
What should happen
## Actual Behavior
What actually happens
## Environment
- OS: macOS/Windows/Linux
- Docker version: 24.0+
- mcp-ssh-orchestrator version: 1.0.0
## Additional Context
Any other relevant informationSecurity Issues:
- Report security issues privately
- Use GitHub security advisories
- Follow responsible disclosure
- Include detailed reproduction steps
- Troubleshooting - Comprehensive troubleshooting guide
- Contributing - How to contribute to the project
- CHANGELOG - Version history and releases
- Security Model - Security architecture details