# π³ GuΓa RΓ‘pida: Docker Desktop + MCP Toolkit
## β¨ Lo que acabamos de crear
Has configurado exitosamente un **servidor MCP containerizado** que permite a Claude/VS Code gestionar tu router OpenWRT a travΓ©s de Docker.
## π― Arquitectura Final
```
βββββββββββββββββββββββββββ
β Claude / VS Code β
β (MCP Client) β
ββββββββββββ¬βββββββββββββββ
β stdio
β
ββββββββββββΌβββββββββββββββ
β Docker Container β
β ββββββββββββββββββββ β
β β MCP Server β β
β β (Python) β β
β ββββββββββ¬ββββββββββ β
βββββββββββββΌββββββββββββββ
β SSH
β
βββββββββββββΌββββββββββββββ
β Router OpenWRT β
β (192.168.1.1) β
βββββββββββββββββββββββββββ
```
## π Quick Start
### 1. Ya tienes la imagen construida β
```powershell
docker images openwrt-ssh-mcp
# OUTPUT: openwrt-ssh-mcp:latest (271MB)
```
### 2. Probar el servidor
```powershell
# OpciΓ³n A: Usando script helper
.\docker-mcp.ps1 run
# OpciΓ³n B: Docker directo
docker run -i --rm --network host --env-file .env `
--mount type=bind,src=$HOME\.ssh,dst=/root/.ssh,readonly `
openwrt-ssh-mcp:latest
```
### 3. Integrar con Claude Desktop
**UbicaciΓ³n:** `%APPDATA%\Claude\claude_desktop_config.json`
Ya tienes dos configuraciones en `claude_desktop_config.json`:
- **`openwrt-router-docker`** β Usa Docker (recomendado)
- **`openwrt-router-local`** β Usa Python local (desarrollo)
**Copiar config:**
```powershell
copy claude_desktop_config.json "$env:APPDATA\Claude\claude_desktop_config.json"
# Reiniciar Claude Desktop
```
### 4. Probar desde Claude
Abre Claude Desktop y pregunta:
> "ΒΏQuΓ© herramientas tienes disponibles para gestionar el router OpenWRT?"
DeberΓas ver 8 herramientas:
- `openwrt_test_connection`
- `openwrt_get_system_info`
- `openwrt_restart_interface`
- `openwrt_get_wifi_status`
- `openwrt_list_dhcp_leases`
- `openwrt_get_firewall_rules`
- `openwrt_read_config`
- `openwrt_execute_command`
## π Scripts Helper
### `docker-mcp.ps1` - Tu herramienta principal
```powershell
# Ver ayuda
.\docker-mcp.ps1
# Construir imagen
.\docker-mcp.ps1 build
# Ejecutar servidor (interactivo)
.\docker-mcp.ps1 run
# Probar conexiΓ³n
.\docker-mcp.ps1 test
# Ver logs
.\docker-mcp.ps1 logs
# Abrir shell en container
.\docker-mcp.ps1 shell
# Limpiar todo
.\docker-mcp.ps1 clean
```
## π§ ConfiguraciΓ³n
### Archivo `.env` (obligatorio)
```bash
# Router OpenWRT
OPENWRT_HOST=192.168.1.1
OPENWRT_PORT=22
OPENWRT_USER=root
# AutenticaciΓ³n (usar KEY_FILE recomendado)
OPENWRT_PASSWORD=
OPENWRT_KEY_FILE=/root/.ssh/id_ed25519
# Seguridad
ENABLE_COMMAND_VALIDATION=true
ENABLE_AUDIT_LOGGING=true
SSH_TIMEOUT=30
```
### Generar SSH Key (recomendado)
```powershell
# Generar llave
ssh-keygen -t ed25519 -f $HOME\.ssh\openwrt_mcp -C "MCP Docker"
# Copiar al router
type $HOME\.ssh\openwrt_mcp.pub | ssh root@192.168.1.1 "cat >> /etc/dropbear/authorized_keys"
# Actualizar .env
# OPENWRT_KEY_FILE=/root/.ssh/openwrt_mcp
```
## ποΈ Docker Compose (alternativo)
```powershell
# Usar docker-compose
docker-compose up
# En background
docker-compose up -d
# Ver logs
docker-compose logs -f
# Detener
docker-compose down
```
## π§ͺ Testing
### Test 1: ConexiΓ³n SSH desde container
```powershell
.\docker-mcp.ps1 shell
# Dentro del container:
ssh -i /root/.ssh/openwrt_mcp root@192.168.1.1 "uname -a"
exit
```
### Test 2: MCP Server standalone
```powershell
.\docker-mcp.ps1 run
# DeberΓas ver:
# INFO - Starting OpenWRT SSH MCP Server...
# INFO - SSH connection established successfully
# INFO - MCP Server ready - waiting for requests...
```
### Test 3: Con MCP Inspector
```powershell
# Instalar (una vez)
npm install -g @modelcontextprotocol/inspector
# Inspeccionar servidor
npx @modelcontextprotocol/inspector docker run -i --rm openwrt-ssh-mcp:latest
```
## π Monitoreo
### Ver logs del servidor
```powershell
# Γltimas 50 lΓneas
.\docker-mcp.ps1 logs
# Seguir en tiempo real
Get-Content .\logs\openwrt_mcp.log -Wait
```
### Ver containers corriendo
```powershell
docker ps | Select-String openwrt
```
### Ver uso de recursos
```powershell
docker stats openwrt-mcp
```
## π Seguridad Implementada
β
**Read-only filesystem** - El container no puede modificar archivos
β
**No capabilities** - Sin permisos especiales del kernel
β
**SSH keys read-only** - Llaves montadas como solo lectura
β
**tmpfs volΓ‘til** - `/tmp` se limpia al apagar
β
**No privilege escalation** - Sin sudo ni escalaciΓ³n
β
**Command validation** - Whitelist de comandos permitidos
β
**Audit logging** - Todos los comandos registrados
## π Networking
### Host Network (actual)
```yaml
network_mode: host
```
**Pros:** Acceso directo al router en LAN
**Contras:** Menos aislamiento
### Bridge Network (alternativo)
```yaml
networks:
- openwrt-network
extra_hosts:
- "router:192.168.1.1"
```
**Pros:** Mejor aislamiento
**Contras:** ConfiguraciΓ³n adicional
## π Workflow de Desarrollo
```powershell
# 1. Hacer cambios en cΓ³digo
code openwrt_ssh_mcp\tools.py
# 2. Rebuild imagen
.\docker-mcp.ps1 build
# 3. Probar
.\docker-mcp.ps1 run
# 4. Ver logs
.\docker-mcp.ps1 logs
# 5. Si funciona, usar desde Claude
```
## π¦ Publicar en Docker Hub
```powershell
# Login
docker login
# Tag
docker tag openwrt-ssh-mcp:latest tuusuario/openwrt-ssh-mcp:latest
# Push
docker push tuusuario/openwrt-ssh-mcp:latest
```
Luego otros pueden usar:
```json
{
"mcpServers": {
"openwrt": {
"command": "docker",
"args": ["run", "-i", "--rm", "tuusuario/openwrt-ssh-mcp:latest"]
}
}
}
```
## π Troubleshooting
### Container no inicia
```powershell
# Ver logs de Docker
docker logs openwrt-mcp
# Verificar .env
cat .env
```
### No puede conectar al router
```powershell
# Test directo desde host
ping 192.168.1.1
ssh root@192.168.1.1
# Test desde container
.\docker-mcp.ps1 shell
ping 192.168.1.1
```
### Claude no detecta el servidor
1. Verificar config: `cat "$env:APPDATA\Claude\claude_desktop_config.json"`
2. Verificar imagen: `docker images openwrt-ssh-mcp`
3. Test standalone: `.\docker-mcp.ps1 run`
4. Reiniciar Claude Desktop completamente
### SSH Permission Denied
```powershell
# Verificar que key estΓ‘ montada
docker run -i --rm `
--mount type=bind,src=$HOME\.ssh,dst=/root/.ssh,readonly `
openwrt-ssh-mcp:latest `
ls -la /root/.ssh
# Verificar permisos locales
icacls $HOME\.ssh\openwrt_mcp
```
## π PrΓ³ximos Pasos
1. β
**Ya tienes:** Imagen Docker construida
2. β
**Ya tienes:** Scripts helper funcionando
3. π **Siguiente:** Configurar `.env` con credenciales reales
4. π **Siguiente:** Probar conexiΓ³n con `.\docker-mcp.ps1 run`
5. π **Siguiente:** Integrar con Claude Desktop
6. π― **Siguiente:** Usar desde Claude para gestionar tu router
## π Recursos
- **MCP Docs:** https://modelcontextprotocol.io/
- **Docker MCP:** https://www.docker.com/blog/dynamic-mcps-with-docker/
- **MCP Servers:** https://github.com/modelcontextprotocol/servers
- **Este proyecto:** `DOCKER_GUIDE.md` y `README.md`
## π‘ Tips
- Usa `.\docker-mcp.ps1` para todas las operaciones comunes
- Los logs se guardan en `logs/openwrt_mcp.log`
- Puedes tener mΓΊltiples servidores MCP corriendo
- Docker Desktop debe estar corriendo
- La imagen es pequeΓ±a (271MB) gracias al multi-stage build
## β
Checklist Final
- [x] Imagen Docker construida
- [x] Script helper creado
- [x] ConfiguraciΓ³n de Claude preparada
- [x] DocumentaciΓ³n completa
- [ ] Archivo `.env` configurado con tu router
- [ ] SSH key generada y copiada al router
- [ ] Probado con `.\docker-mcp.ps1 run`
- [ ] Integrado con Claude Desktop
- [ ] Primera prueba exitosa desde Claude
---
**Β‘Todo listo!** π Ahora solo necesitas configurar tu `.env` con las credenciales de tu router y probar.
**Comando para empezar:**
```powershell
.\docker-mcp.ps1 run
```