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

HerramientaDescripción
write_to_terminalEnvía comandos a la terminal. El Enter se añade automáticamente. Devuelve el número de líneas de salida nuevas.
read_terminal_outputLee las últimas N líneas del búfer de la terminal.
send_control_characterEnvía Ctrl+C, Ctrl+Z, Escape o cualquier carácter de control.

Gestión de superficies (pestañas)

HerramientaDescripción
list_surfacesLista todas las pestañas de un espacio de trabajo con IDs y títulos.
new_surfaceCrea una nueva pestaña de terminal.
close_surfaceCierra una pestaña específica.
focus_surfaceEnfoca (activa) una pestaña específica.
move_surfaceMueve una pestaña a otro panel, ventana o posición.
reorder_surfaceReordena una pestaña dentro de su panel.
rename_tabRenombra una pestaña.
new_splitDivide la superficie actual en un nuevo panel.
drag_surface_to_splitArrastra una superficie para crear una división.
refresh_surfacesActualiza todas las superficies.
surface_healthComprueba el estado de las superficies.

Gestión de paneles

HerramientaDescripción
list_panesLista todos los paneles de un espacio de trabajo.
new_paneCrea un nuevo panel (división) con dirección.
focus_paneEnfoca un panel específico.
resize_paneRedimensiona un panel en una dirección dada.
swap_paneIntercambia dos paneles.
break_paneExtrae un panel a un nuevo espacio de trabajo.
join_paneUne un panel a otro panel.
last_paneCambia al último panel activo.
list_panelsLista todos los paneles de un espacio de trabajo.
focus_panelEnfoca un panel específico.

Gestión de ventanas

HerramientaDescripción
list_windowsLista todas las ventanas.
new_windowCrea una nueva ventana.
close_windowCierra una ventana específica.
focus_windowEnfoca una ventana específica.
current_windowMuestra información de la ventana actual.
rename_windowRenombra la ventana actual.
next_window / previous_window / last_windowNavega entre ventanas.
move_workspace_to_windowMueve un espacio de trabajo a otra ventana.

Gestión de espacios de trabajo

HerramientaDescripción
list_workspacesLista todos los espacios de trabajo.
new_workspaceCrea un nuevo espacio de trabajo con cwd/comando opcional.
close_workspaceCierra un espacio de trabajo específico.
select_workspaceCambia a un espacio de trabajo específico.
rename_workspaceRenombra un espacio de trabajo.
current_workspaceMuestra información del espacio de trabajo actual.
reorder_workspaceReordena un espacio de trabajo en la barra lateral.

Búsqueda y estructura

HerramientaDescripción
find_windowBusca una ventana por contenido o título.
treeMuestra la estructura de árbol completa (ventanas/espacios de trabajo/paneles/superficies).
identifyMuestra información de identidad de la superficie/espacio de trabajo actual.

Notificaciones

HerramientaDescripción
notifyEnvía una notificación con título, subtítulo y cuerpo.
list_notificationsLista todas las notificaciones.
clear_notificationsBorra todas las notificaciones.

Metadatos de la barra lateral

HerramientaDescripción
set_status / clear_status / list_statusGestiona las entradas de estado en la barra lateral.
set_progress / clear_progressGestiona una barra de progreso en la barra lateral.
sidebar_stateMuestra el estado actual de la barra lateral.

Registro

HerramientaDescripción
logEscribe una entrada de registro en la barra lateral del espacio de trabajo.
clear_logBorra las entradas de registro.
list_logLista las entradas de registro.

Búfer

HerramientaDescripción
set_bufferEstablece un búfer con nombre y contenido de texto.
list_buffersLista todos los búferes.
paste_bufferPega un búfer en la terminal.

Control de terminal

HerramientaDescripción
clear_historyBorra el historial de scrollback de la terminal.
capture_paneCaptura el contenido del panel (compatible con tmux).
respawn_paneReinicia un panel (reinicia el shell).
pipe_paneRedirige la salida del panel a un comando de shell.
display_messageMuestra una superposición de mensaje.
trigger_flashActiva un destello visual en la terminal.

Hooks y varios

HerramientaDescripción
set_hookEstablece, lista o elimina hooks de eventos.
wait_forEspera o envía una señal con nombre.
set_app_focusEstablece el estado de foco de la aplicación.
markdown_openAbre un archivo markdown en un visor formateado con recarga en vivo.
versionMuestra la versión de cmux.
pingHace ping al socket de cmux.

Navegador

HerramientaDescripción
browserControla 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)
FocoPuede robar el foco, activar la appSin cambio de foco, socket Unix
Lectura de búferGhostty write_scrollback_file (solo depuración)cmux read-screen (API de producción estable)
InicioFalla si la app no está completamente inicializadaBasado en socket, más resistente
SegmentaciónSiempre "ventana frontal"Flag --surface para segmentación precisa de paneles
Soporte de teclasSolo códigos ASCIITeclas con nombre: ctrl+c, escape, enter, flechas
EstabilidadFrágil ante cambios de estado de la appDesacoplado 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:

IncidenciaProblemaCómo lo maneja cmux-mcp
#152read-screen era solo de depuraciónUsa la CLI de producción ahora estable
#2042El ID de superficie no válido vuelve silenciosamente al panel enfocadoLa arquitectura admite --surface para segmentación explícita
#1715TabManager no disponible durante el inicio rompe los hooksLa CLI basada en socket evita problemas de sincronización de inicialización
#2153send-key no admitía teclas de flechaUsa la API upstream actualizada con soporte completo de teclas
#2210La alternancia de la barra lateral corrompe el prompt mediante SIGWINCHLee 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óduloFunción
cmux-pathResuelve la ruta del binario cmux: env CMUX_PATH > which cmux > rutas predeterminadas de macOS > fallback
CommandExecutorEnvía comandos mediante cmux send, espera la finalización. Almacena en caché la ruta TTY durante 60s.
TtyOutputReaderLee el búfer de la terminal mediante cmux read-screen
SendControlCharacterEnvía teclas de control mediante cmux send-key
ProcessTrackerSupervisa 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

Privacidad

cmux-mcp no recopila ni transmite ningún dato. Todo el procesamiento es local. Consulta PRIVACY.md para más detalles.

Licencia

MIT