cmux-mcp
Servidor MCP para controlar cmux (terminal basado en Ghostty) mediante CLI nativa. Envía comandos, lee salida, envía caracteres de control — todo en segundo plano a través de un socket Unix.
Documentación
cmux-mcp
Servidor MCP que da a los agentes de IA control total sobre tu terminal cmux.
Permite que Claude ejecute comandos, lea la salida, gestione pestañas/paneles/espacios de trabajo/ventanas y envíe caracteres de control en tu terminal cmux, todo a través del Model Context Protocol. Funciona en segundo plano. Sin robo de foco.
Inicio rápido
Opción A: Plugin de Claude Code (Recomendado)
/plugin marketplace add daegweon/cmux-mcp
/plugin install cmux-mcp@cmux-tools
Eso es todo. El servidor MCP se configura automáticamente.
Opción B: npx (Sin necesidad de compilar)
Edita ~/.claude/settings.json:
{
"mcpServers": {
"cmux-mcp": {
"command": "npx",
"args": ["-y", "cmux-mcp"]
}
}
}
Reinicia Claude Code.
Opción C: Clonar y compilar
git clone https://github.com/daegweon/cmux-mcp.git
cd cmux-mcp
npm install && npm run build
Edita ~/.claude/settings.json:
{
"mcpServers": {
"cmux-mcp": {
"command": "node",
"args": ["/absolute/path/to/cmux-mcp/build/index.js"]
}
}
}
Reinicia Claude Code.
Configuración de Claude Desktop
Edita ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"cmux-mcp": {
"command": "node",
"args": ["/absolute/path/to/cmux-mcp/build/index.js"]
}
}
}
Reinicia Claude Desktop después de guardar.
Cualquier cliente MCP
cmux-mcp se comunica a través de stdio. Apunta tu cliente MCP a node /path/to/cmux-mcp/build/index.js.
Requisitos
- macOS
- cmux.app instalado y en ejecución
- Node.js 18+
- Modo de control de socket de cmux configurado en Automation o Open Access (Settings > Automation > Socket Control Mode)
Herramientas
cmux-mcp expone la CLI completa de cmux como herramientas MCP. Todas las herramientas de E/S de terminal admiten un parámetro opcional surface para apuntar a pestañas específicas.
E/S de terminal
| Herramienta | Descripción |
|---|---|
write_to_terminal | Envía comandos a la terminal. El Enter se añade automáticamente. Devuelve el número de líneas de salida nuevas. |
read_terminal_output | Lee las últimas N líneas del búfer de la terminal. |
send_control_character | Envía Ctrl+C, Ctrl+Z, Escape o cualquier carácter de control. |
Gestión de superficies (pestañas)
| Herramienta | Descripción |
|---|---|
list_surfaces | Lista todas las pestañas de un espacio de trabajo con IDs y títulos. |
new_surface | Crea una nueva pestaña de terminal. |
close_surface | Cierra una pestaña específica. |
focus_surface | Enfoca (activa) una pestaña específica. |
move_surface | Mueve una pestaña a otro panel, ventana o posición. |
reorder_surface | Reordena una pestaña dentro de su panel. |
rename_tab | Renombra una pestaña. |
new_split | Divide la superficie actual en un nuevo panel. |
drag_surface_to_split | Arrastra una superficie para crear una división. |
refresh_surfaces | Actualiza todas las superficies. |
surface_health | Comprueba el estado de las superficies. |
Gestión de paneles
| Herramienta | Descripción |
|---|---|
list_panes | Lista todos los paneles de un espacio de trabajo. |
new_pane | Crea un nuevo panel (división) con dirección. |
focus_pane | Enfoca un panel específico. |
resize_pane | Redimensiona un panel en una dirección dada. |
swap_pane | Intercambia dos paneles. |
break_pane | Extrae un panel a un nuevo espacio de trabajo. |
join_pane | Une un panel a otro panel. |
last_pane | Cambia al último panel activo. |
list_panels | Lista todos los paneles de un espacio de trabajo. |
focus_panel | Enfoca un panel específico. |
Gestión de ventanas
| Herramienta | Descripción |
|---|---|
list_windows | Lista todas las ventanas. |
new_window | Crea una nueva ventana. |
close_window | Cierra una ventana específica. |
focus_window | Enfoca una ventana específica. |
current_window | Muestra información de la ventana actual. |
rename_window | Renombra la ventana actual. |
next_window / previous_window / last_window | Navega entre ventanas. |
move_workspace_to_window | Mueve un espacio de trabajo a otra ventana. |
Gestión de espacios de trabajo
| Herramienta | Descripción |
|---|---|
list_workspaces | Lista todos los espacios de trabajo. |
new_workspace | Crea un nuevo espacio de trabajo con cwd/comando opcional. |
close_workspace | Cierra un espacio de trabajo específico. |
select_workspace | Cambia a un espacio de trabajo específico. |
rename_workspace | Renombra un espacio de trabajo. |
current_workspace | Muestra información del espacio de trabajo actual. |
reorder_workspace | Reordena un espacio de trabajo en la barra lateral. |
Búsqueda y estructura
| Herramienta | Descripción |
|---|---|
find_window | Busca una ventana por contenido o título. |
tree | Muestra la estructura de árbol completa (ventanas/espacios de trabajo/paneles/superficies). |
identify | Muestra información de identidad de la superficie/espacio de trabajo actual. |
Notificaciones
| Herramienta | Descripción |
|---|---|
notify | Envía una notificación con título, subtítulo y cuerpo. |
list_notifications | Lista todas las notificaciones. |
clear_notifications | Borra todas las notificaciones. |
Metadatos de la barra lateral
| Herramienta | Descripción |
|---|---|
set_status / clear_status / list_status | Gestiona las entradas de estado en la barra lateral. |
set_progress / clear_progress | Gestiona una barra de progreso en la barra lateral. |
sidebar_state | Muestra el estado actual de la barra lateral. |
Registro
| Herramienta | Descripción |
|---|---|
log | Escribe una entrada de registro en la barra lateral del espacio de trabajo. |
clear_log | Borra las entradas de registro. |
list_log | Lista las entradas de registro. |
Búfer
| Herramienta | Descripción |
|---|---|
set_buffer | Establece un búfer con nombre y contenido de texto. |
list_buffers | Lista todos los búferes. |
paste_buffer | Pega un búfer en la terminal. |
Control de terminal
| Herramienta | Descripción |
|---|---|
clear_history | Borra el historial de scrollback de la terminal. |
capture_pane | Captura el contenido del panel (compatible con tmux). |
respawn_pane | Reinicia un panel (reinicia el shell). |
pipe_pane | Redirige la salida del panel a un comando de shell. |
display_message | Muestra una superposición de mensaje. |
trigger_flash | Activa un destello visual en la terminal. |
Hooks y varios
| Herramienta | Descripción |
|---|---|
set_hook | Establece, lista o elimina hooks de eventos. |
wait_for | Espera o envía una señal con nombre. |
set_app_focus | Establece el estado de foco de la aplicación. |
markdown_open | Abre un archivo markdown en un visor formateado con recarga en vivo. |
version | Muestra la versión de cmux. |
ping | Hace ping al socket de cmux. |
Navegador
| Herramienta | Descripción |
|---|---|
browser | Controla el navegador integrado de cmux con subcomandos: open, navigate, snapshot, click, type, eval, screenshot y muchos más. |
Ejemplos del mundo real
Ejecutar pruebas y analizar fallos:
"Ejecuta la suite de pruebas y dime qué pruebas están fallando"
Claude envía npm test, lee la salida y resume los fallos.
Sesiones SSH con múltiples pestañas:
"Abre dos pestañas nuevas, haz SSH a server-a en una y a server-b en la otra, luego compara su uso de disco"
Claude crea pestañas, envía comandos SSH a cada una, lee la salida de ambas y compara.
Sesión REPL interactiva:
"Abre un REPL de Python y comprueba si pandas está instalado"
Claude inicia python3, escribe import pandas, lee el resultado e informa.
Gestión de procesos de larga duración:
"Inicia el servidor de desarrollo, espera a que esté listo y luego ejecuta la comprobación de salud"
Claude envía el comando de inicio, consulta la salida hasta que aparece "ready" y luego ejecuta el siguiente comando.
¿Por qué cmux-mcp?
Operación en segundo plano
cmux-mcp utiliza la CLI nativa de cmux (cmux send, cmux read-screen, cmux send-key) que se comunica a través de un socket Unix. Esto significa:
- Funciona mientras cmux está en segundo plano
- Sin robo de foco de ventana
- Sin retrasos de activación de AppleScript
- Fiable incluso durante la inicialización de la aplicación
CLI vs AppleScript
Este proyecto se bifurcó de ferrislucas/iterm-mcp y se reescribió por completo. He aquí por qué:
| AppleScript (iterm-mcp) | cmux CLI (cmux-mcp) | |
|---|---|---|
| Foco | Puede robar el foco, activar la app | Sin cambio de foco, socket Unix |
| Lectura de búfer | Ghostty write_scrollback_file (solo depuración) | cmux read-screen (API de producción estable) |
| Inicio | Falla si la app no está completamente inicializada | Basado en socket, más resistente |
| Segmentación | Siempre "ventana frontal" | Flag --surface para segmentación precisa de paneles |
| Soporte de teclas | Solo códigos ASCII | Teclas con nombre: ctrl+c, escape, enter, flechas |
| Estabilidad | Frágil ante cambios de estado de la app | Desacoplado mediante IPC por socket |
Detección inteligente de finalización
cmux-mcp no espera a ciegas después de enviar un comando. Supervisa la actividad de CPU del TTY para saber cuándo termina realmente un comando, incluso para comandos que producen salida con el tiempo. A partir de v1.3.1, el intervalo de sondeo se redujo de 350ms a 150ms y el umbral de inactividad de 1000ms a 500ms, lo que hace que write_to_terminal sea aproximadamente 2 veces más rápido.
Eficiente en tokens
Los agentes leen solo las líneas que necesitan. ¿Un npm test que produce 500 líneas de salida? El agente primero recibe el mensaje "se generaron 500 líneas" y luego lee solo las últimas 20 líneas para comprobar si hay errores. Sin desperdicio de ventana de contexto.
Manejo de problemas conocidos de cmux
La arquitectura de cmux-mcp evita varios casos límite conocidos de cmux:
| Incidencia | Problema | Cómo lo maneja cmux-mcp |
|---|---|---|
| #152 | read-screen era solo de depuración | Usa la CLI de producción ahora estable |
| #2042 | El ID de superficie no válido vuelve silenciosamente al panel enfocado | La arquitectura admite --surface para segmentación explícita |
| #1715 | TabManager no disponible durante el inicio rompe los hooks | La CLI basada en socket evita problemas de sincronización de inicialización |
| #2153 | send-key no admitía teclas de flecha | Usa la API upstream actualizada con soporte completo de teclas |
| #2210 | La alternancia de la barra lateral corrompe el prompt mediante SIGWINCH | Lee el búfer después de un retraso de asentamiento para evitar salida corrupta |
Arquitectura
MCP Client (Claude Code, Claude Desktop, etc.)
| stdio
cmux-mcp server
| child_process
cmux CLI (send / read-screen / send-key / ...)
| Unix socket
cmux.app (Ghostty-based terminal)
|
macOS PTY
Módulos principales:
| Módulo | Función |
|---|---|
cmux-path | Resuelve la ruta del binario cmux: env CMUX_PATH > which cmux > rutas predeterminadas de macOS > fallback |
CommandExecutor | Envía comandos mediante cmux send, espera la finalización. Almacena en caché la ruta TTY durante 60s. |
TtyOutputReader | Lee el búfer de la terminal mediante cmux read-screen |
SendControlCharacter | Envía teclas de control mediante cmux send-key |
ProcessTracker | Supervisa los procesos TTY para la detección de finalización |
Desarrollo
npm run build # Compile TypeScript
npm run watch # Auto-rebuild on changes
npm test # Run unit tests
npm run e2e # Run E2E tests (requires running cmux)
npm run inspector # Open MCP Inspector for interactive debugging
Seguridad
- Sin restricciones de comandos integradas. Los comandos se ejecutan con los permisos de tu shell.
- Supervisa la actividad de la IA e interrumpe si es necesario.
- Comienza con tareas enfocadas hasta que te familiarices con el comportamiento del modelo.
Créditos
- Bifurcado de ferrislucas/iterm-mcp
- Construido para cmux por manaflow.ai
Privacidad
cmux-mcp no recopila ni transmite ningún dato. Todo el procesamiento es local. Consulta PRIVACY.md para más detalles.
Licencia
MIT