cmux-mcp
Servidor MCP para controlar o cmux (terminal baseado em Ghostty) via CLI nativa. Envie comandos, leia saídas, envie caracteres de controle — tudo em segundo plano via socket Unix.
Documentação
cmux-mcp
Servidor MCP que dá aos agentes de IA controle total do seu terminal cmux.
Deixe o Claude executar comandos, ler saídas, gerenciar abas/painéis/workspaces/janelas e enviar caracteres de controle no seu terminal cmux — tudo através do Model Context Protocol. Funciona em segundo plano. Sem roubo de foco.
Início Rápido
Opção A: Plugin Claude Code (Recomendado)
/plugin marketplace add daegweon/cmux-mcp
/plugin install cmux-mcp@cmux-tools
É isso. O servidor MCP é configurado automaticamente.
Opção B: npx (Sem necessidade de build)
Edite ~/.claude/settings.json:
{
"mcpServers": {
"cmux-mcp": {
"command": "npx",
"args": ["-y", "cmux-mcp"]
}
}
}
Reinicie o Claude Code.
Opção C: Clonar e compilar
git clone https://github.com/daegweon/cmux-mcp.git
cd cmux-mcp
npm install && npm run build
Edite ~/.claude/settings.json:
{
"mcpServers": {
"cmux-mcp": {
"command": "node",
"args": ["/absolute/path/to/cmux-mcp/build/index.js"]
}
}
}
Reinicie o Claude Code.
Configuração do Claude Desktop
Edite ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"cmux-mcp": {
"command": "node",
"args": ["/absolute/path/to/cmux-mcp/build/index.js"]
}
}
}
Reinicie o Claude Desktop após salvar.
Qualquer cliente MCP
O cmux-mcp se comunica via stdio. Aponte seu cliente MCP para node /path/to/cmux-mcp/build/index.js.
Requisitos
- macOS
- cmux.app instalado e em execução
- Node.js 18+
- Modo de controle do socket cmux definido como Automação ou Acesso Aberto (Configurações > Automação > Modo de Controle do Socket)
Ferramentas
O cmux-mcp expõe toda a CLI do cmux como ferramentas MCP. Todas as ferramentas de E/S do terminal suportam um parâmetro opcional surface para direcionar abas específicas.
E/S do Terminal
| Ferramenta | Descrição |
|---|---|
write_to_terminal | Envia comandos ao terminal. Enter é anexado automaticamente. Retorna a contagem de novas linhas de saída. |
read_terminal_output | Lê as últimas N linhas do buffer do terminal. |
send_control_character | Envia Ctrl+C, Ctrl+Z, Escape ou qualquer caractere de controle. |
Gerenciamento de Superfícies (Abas)
| Ferramenta | Descrição |
|---|---|
list_surfaces | Lista todas as abas em um workspace com IDs e títulos. |
new_surface | Cria uma nova aba de terminal. |
close_surface | Fecha uma aba específica. |
focus_surface | Foca (ativa) uma aba específica. |
move_surface | Move uma aba para um painel, janela ou posição diferente. |
reorder_surface | Reordena uma aba dentro do seu painel. |
rename_tab | Renomeia uma aba. |
new_split | Divide a superfície atual em um novo painel. |
drag_surface_to_split | Arrasta uma superfície para criar uma divisão. |
refresh_surfaces | Atualiza todas as superfícies. |
surface_health | Verifica a saúde das superfícies. |
Gerenciamento de Painéis
| Ferramenta | Descrição |
|---|---|
list_panes | Lista todos os painéis em um workspace. |
new_pane | Cria um novo painel (divisão) com direção. |
focus_pane | Foca um painel específico. |
resize_pane | Redimensiona um painel em uma direção dada. |
swap_pane | Troca dois painéis. |
break_pane | Extrai um painel para um novo workspace. |
join_pane | Junta um painel em outro painel. |
last_pane | Alterna para o último painel ativo. |
list_panels | Lista todos os painéis em um workspace. |
focus_panel | Foca um painel específico. |
Gerenciamento de Janelas
| Ferramenta | Descrição |
|---|---|
list_windows | Lista todas as janelas. |
new_window | Cria uma nova janela. |
close_window | Fecha uma janela específica. |
focus_window | Foca uma janela específica. |
current_window | Mostra informações da janela atual. |
rename_window | Renomeia a janela atual. |
next_window / previous_window / last_window | Navega entre janelas. |
move_workspace_to_window | Move um workspace para uma janela diferente. |
Gerenciamento de Workspaces
| Ferramenta | Descrição |
|---|---|
list_workspaces | Lista todos os workspaces. |
new_workspace | Cria um novo workspace com cwd/comando opcional. |
close_workspace | Fecha um workspace específico. |
select_workspace | Alterna para um workspace específico. |
rename_workspace | Renomeia um workspace. |
current_workspace | Mostra informações do workspace atual. |
reorder_workspace | Reordena um workspace na barra lateral. |
Pesquisa e Estrutura
| Ferramenta | Descrição |
|---|---|
find_window | Pesquisa uma janela por conteúdo ou título. |
tree | Mostra a estrutura completa da árvore (janelas/workspaces/painéis/superfícies). |
identify | Mostra informações de identidade da superfície/workspace atual. |
Notificações
| Ferramenta | Descrição |
|---|---|
notify | Envia uma notificação com título, subtítulo e corpo. |
list_notifications | Lista todas as notificações. |
clear_notifications | Limpa todas as notificações. |
Metadados da Barra Lateral
| Ferramenta | Descrição |
|---|---|
set_status / clear_status / list_status | Gerencia entradas de status na barra lateral. |
set_progress / clear_progress | Gerencia uma barra de progresso na barra lateral. |
sidebar_state | Mostra o estado atual da barra lateral. |
Log
| Ferramenta | Descrição |
|---|---|
log | Escreve uma entrada de log na barra lateral do workspace. |
clear_log | Limpa entradas de log. |
list_log | Lista entradas de log. |
Buffer
| Ferramenta | Descrição |
|---|---|
set_buffer | Define um buffer nomeado com conteúdo de texto. |
list_buffers | Lista todos os buffers. |
paste_buffer | Cola um buffer no terminal. |
Controle do Terminal
| Ferramenta | Descrição |
|---|---|
clear_history | Limpa o histórico de scrollback do terminal. |
capture_pane | Captura o conteúdo do painel (compatível com tmux). |
respawn_pane | Reinicia um painel (reinicia o shell). |
pipe_pane | Envia a saída do painel para um comando shell. |
display_message | Exibe uma sobreposição de mensagem. |
trigger_flash | Aciona um flash visual no terminal. |
Hooks e Diversos
| Ferramenta | Descrição |
|---|---|
set_hook | Define, lista ou remove hooks de eventos. |
wait_for | Aguarda ou envia um sinal nomeado. |
set_app_focus | Define o estado de foco do aplicativo. |
markdown_open | Abre um arquivo markdown em um visualizador formatado com recarga automática. |
version | Mostra a versão do cmux. |
ping | Envia ping ao socket do cmux. |
Navegador
| Ferramenta | Descrição |
|---|---|
browser | Controla o navegador integrado do cmux com subcomandos: open, navigate, snapshot, click, type, eval, screenshot e muitos outros. |
Exemplos do Mundo Real
Executar testes e analisar falhas:
"Execute a suíte de testes e me diga quais testes estão falhando"
O Claude envia npm test, lê a saída e resume as falhas.
Sessões SSH multi-abas:
"Abra duas novas abas, conecte via SSH ao server-a em uma e ao server-b na outra, depois compare o uso de disco deles"
O Claude cria abas, envia comandos SSH para cada uma, lê a saída de ambas e compara.
Sessão REPL interativa:
"Abra um REPL Python e verifique se o pandas está instalado"
O Claude inicia python3, digita import pandas, lê o resultado e reporta.
Gerenciamento de processos de longa duração:
"Inicie o servidor de desenvolvimento, aguarde até que esteja pronto e depois execute a verificação de saúde"
O Claude envia o comando de início, verifica a saída até que "ready" apareça e então executa o próximo comando.
Por que cmux-mcp?
Operação em segundo plano
O cmux-mcp usa a CLI nativa do cmux (cmux send, cmux read-screen, cmux send-key) que se comunica via socket Unix. Isso significa:
- Funciona enquanto o cmux está em segundo plano
- Sem roubo de foco da janela
- Sem atrasos de ativação via AppleScript
- Confiável mesmo durante a inicialização do aplicativo
CLI vs AppleScript
Este projeto foi bifurcado de ferrislucas/iterm-mcp e completamente reescrito. Veja o porquê:
| AppleScript (iterm-mcp) | cmux CLI (cmux-mcp) | |
|---|---|---|
| Foco | Pode roubar foco, ativar o aplicativo | Sem mudança de foco, socket Unix |
| Leitura de buffer | Ghostty write_scrollback_file (somente debug) | cmux read-screen (API de produção estável) |
| Inicialização | Falha se o aplicativo não estiver totalmente inicializado | Baseado em socket, mais resiliente |
| Direcionamento | Sempre "janela frontal" | Flag --surface para direcionamento preciso de painéis |
| Suporte a teclas | Somente códigos ASCII | Teclas nomeadas: ctrl+c, escape, enter, setas |
| Estabilidade | Frágil a mudanças de estado do aplicativo | Desacoplado via IPC por socket |
Detecção inteligente de conclusão
O cmux-mcp não apenas espera cegamente após enviar um comando. Ele monitora a atividade da CPU do TTY para saber quando um comando realmente termina — mesmo para comandos que produzem saída ao longo do tempo. A partir da v1.3.1, o intervalo de polling foi reduzido de 350ms para 150ms e o limite de inatividade de 1000ms para 500ms, tornando o write_to_terminal aproximadamente 2x mais rápido.
Eficiente em tokens
Os agentes leem apenas as linhas de que precisam. Um npm test que produz 500 linhas de saída? O agente primeiro é informado "500 linhas foram geradas" e depois lê apenas as últimas 20 linhas para verificar erros. Sem desperdício de janela de contexto.
Lidando com Problemas Conhecidos do cmux
A arquitetura do cmux-mcp evita vários casos extremos conhecidos do cmux:
| Problema | Problema | Como o cmux-mcp lida |
|---|---|---|
| #152 | read-screen era somente debug | Usa a CLI de produção agora estável |
| #2042 | ID de superfície inválido cai silenciosamente para o painel focado | A arquitetura suporta --surface para direcionamento explícito |
| #1715 | TabManager indisponível durante a inicialização quebra hooks | A CLI baseada em socket evita problemas de temporização de inicialização |
| #2153 | send-key não suportava teclas de seta | Usa a API upstream atualizada com suporte completo a teclas |
| #2210 | Alternância da barra lateral corrompe o prompt via SIGWINCH | Lê o buffer após atraso de estabilização para evitar saída corrompida |
Arquitetura
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 principais:
| Módulo | Função |
|---|---|
cmux-path | Resolve o caminho do binário cmux: env CMUX_PATH > which cmux > caminhos padrão do macOS > fallback |
CommandExecutor | Envia comandos via cmux send, aguarda a conclusão. Armazena em cache o caminho do TTY por 60s. |
TtyOutputReader | Lê o buffer do terminal via cmux read-screen |
SendControlCharacter | Envia teclas de controle via cmux send-key |
ProcessTracker | Monitora processos do TTY para detecção de conclusão |
Desenvolvimento
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
Segurança
- Sem restrições de comando integradas. Os comandos são executados com as permissões do seu shell.
- Monitore a atividade da IA e interrompa se necessário.
- Comece com tarefas focadas até se familiarizar com o comportamento do modelo.
Créditos
- Bifurcado de ferrislucas/iterm-mcp
- Construído para cmux por manaflow.ai
Privacidade
O cmux-mcp não coleta nem transmite nenhum dado. Todo o processamento é local. Consulte PRIVACY.md para detalhes.
Licença
MIT