enhanced-terminal
Um executor de comandos shell / terminal com suporte a async
Documentação
Servidor MCP de Terminal Avançado
Um servidor autônomo de Model Context Protocol (MCP) que fornece execução de terminal, detecção de binários e recursos de detecção de shell.
Recursos
Ferramentas
-
enhanced_terminal - Executa comandos de shell com alternância assíncrona inteligente
- Saída em Fluxo Contínuo: Notificações de saída em tempo real no modo síncrono
- Alterna automaticamente para segundo plano após 50 segundos (configurável)
- Suporte a PTY com emulação de terminal adequada
- Diretório de trabalho, shell, tempo limite e limites de pré-visualização de tokens configuráveis
- Lista de bloqueio de segurança impede comandos perigosos
- Retorna ID do trabalho para rastrear tarefas em segundo plano
-
enhanced_terminal_job_status - Obtém status e saída de trabalhos em segundo plano
- Verifica o progresso de comandos de longa duração
- Recupera a saída completa quando concluída
- Visualiza códigos de saída e duração
-
enhanced_terminal_job_list - Lista todos os trabalhos (em execução e concluídos)
- Visualiza histórico recente de comandos
- Filtra e limita resultados
- Visão geral rápida dos status dos trabalhos
-
enhanced_terminal_job_cancel - Cancela trabalhos em segundo plano em execução (somente Unix)
- Envia SIGTERM para processos em execução
- Encerramento gracioso de comandos de longa duração
-
enhanced_terminal_job_stdin - Envia entrada para trabalhos em segundo plano em execução
- Escreve texto UTF-8 exato no stdin do PTY de um trabalho
- Inclua
\neminputpara submeter uma linha - Útil para prompts após comandos alternarem para segundo plano
-
detect_binaries - Detecta ferramentas de desenvolvimento com 16 verificações simultâneas
- Verifica o PATH em busca de 190+ ferramentas de desenvolvimento comuns em 26 categorias
- Detecção rápida de versões em paralelo
- Suporta filtragem por categoria (rust_tools, python_tools, etc.)
- Categorias incluem: gerenciadores de pacotes, sistemas de build, ferramentas de linguagens de programação, editores, contêineres e mais
Observação: As informações de shell são detectadas automaticamente na inicialização do servidor e incluídas nas instruções do servidor, portanto não é necessária nenhuma chamada de ferramenta separada para descobrir shells disponíveis.
Principais Recursos
- Notificações em Fluxo Contínuo: Emite notificações de registro MCP conforme a saída do comando chega (o suporte do cliente varia)
- Alternância Assíncrona Inteligente: Comandos passam automaticamente para segundo plano após 50 segundos (configurável)
- Lista de Bloqueio de Segurança: Bloqueia comandos perigosos como
rm -rf /,shutdown, bombas de fork, etc. - Gerenciamento de Trabalhos: Rastreia, monitora, envia entrada para stdin e cancela trabalhos em segundo plano com metadados ricos
- Filtragem de Trabalhos: Filtra trabalhos por status, tags ou diretório de trabalho
- Paginação de Saída: Busca intervalos específicos de bytes em registros muito longos
- Tags de Trabalhos: Categoriza trabalhos com tags personalizadas para facilitar a filtragem
- Registro de Chamadas: Acrescenta toda solicitação de execução de shell
enhanced_terminalaenhanced_terminal_calls.jsonl - 16 Verificações Simultâneas: Detecção rápida e paralela de binários
- Suporte a PTY: Emulação completa de terminal para comandos interativos
Instalação
Pré-requisitos
- Rust com suporte à edição 2024 (Rust 1.85+ recomendado)
- Cargo
Compilar a partir do Código-Fonte
git clone <repository-url>
cd enhanced-terminal-mcp
cargo build --release
O binário estará localizado em target/release/enhanced-terminal-mcp.
Fluxo de Trabalho com Sudo (Recomendado)
Este servidor lida com comandos sudo automaticamente para evitar prompts de senha durante a execução de ferramentas:
- Primeiro comando sudo: Dispara um diálogo askpass (via
sudo -A -v) para autenticar uma vez - Comandos sudo subsequentes: Reescritos para
sudo -n(não interativo) e usam o timestamp sudo em cache - Keepalive: Tarefa em segundo plano renova o timestamp a cada 5 minutos para mantê-lo válido
Tudo isso está habilitado por padrão. O campo sudo_wrapper_applied nos resultados mostra quando o sinalizador -n foi adicionado.
Configuração Recomendada: Compartilhamento de Timestamp do Sudoers
Para a melhor experiência, configure o sudo para compartilhar timestamps em todas as suas sessões (não apenas por TTY):
- Crie
/etc/sudoers.d/enhanced-terminal-mcpusandovisudo:
sudo visudo -f /etc/sudoers.d/enhanced-terminal-mcp
- Adicione estas linhas:
Defaults !tty_tickets
Defaults timestamp_timeout=10
Defaults use_pty
-
Benefícios:
- Ative o sudo uma vez em qualquer terminal:
sudo -v - O servidor MCP reutilizará esse timestamp automaticamente
- Nenhum diálogo askpass necessário (a menos que o timestamp expire)
- Funciona em todas as suas sessões de terminal e no servidor MCP
- Ative o sudo uma vez em qualquer terminal:
-
Nota de segurança:
!tty_ticketssignifica que qualquer processo executado com seu usuário pode reutilizar seu timestamp sudo enquanto ele estiver válido. Mantenhatimestamp_timeoutrazoável (por exemplo, 10 minutos).
Alternativa: Fluxo de Trabalho Baseado em Askpass (Comportamento Padrão)
Se você preferir não alterar o sudoers, os padrões do servidor funcionarão:
- Caminho padrão do askpass:
~/scripts/askpass-zenity.sh - Primeiro comando sudo → diálogo askpass
- Servidor mantém o timestamp ativo → sem mais prompts
O servidor repassará automaticamente estas variáveis de ambiente para o askpass gráfico:
DISPLAY(padrão::0)WAYLAND_DISPLAY(padrão:wayland-0)XDG_RUNTIME_DIRDBUS_SESSION_BUS_ADDRESS
Configuração (Opcional)
Estas variáveis de ambiente controlam o comportamento do sudo (todas com padrão LIGADO):
# Enable/disable sudo wrapping and keepalive (default: 1)
ENHANCED_TERMINAL_SUDO_WRAP=1
ENHANCED_TERMINAL_SUDO_KEEPALIVE=1
ENHANCED_TERMINAL_SUDO_KEEPALIVE_PRIME=1
# Custom askpass path (default: ~/scripts/askpass-zenity.sh)
ENHANCED_TERMINAL_SUDO_ASKPASS=/path/to/your/askpass.sh
# Keepalive refresh interval in seconds (default: 300, min: 30)
ENHANCED_TERMINAL_SUDO_KEEPALIVE_REFRESH_SECS=300
Depuração
Habilite o registro detalhado para ver o comportamento de preparação/encapsulamento do sudo:
RUST_LOG=debug enhanced-terminal-mcp
Procure linhas de registro sobre sudo -A -v (preparação) e sudo -n (encapsulamento).
Uso
Executando o Servidor
O servidor usa transporte stdio para comunicação MCP:
./enhanced-terminal-mcp
Configuração
Adicione à configuração do seu cliente MCP:
{
"mcpServers": {
"enhanced-terminal": {
"command": "/path/to/enhanced-terminal-mcp",
"args": []
}
}
}
Registro de Chamadas
Cada chamada de ferramenta enhanced_terminal é acrescentada como um objeto JSON por linha em enhanced_terminal_calls.jsonl na raiz do repositório. Cada entrada inclui um datetime RFC3339 UTC, o nome da ferramenta e os parâmetros completos enviados. As gravações usam um mutex de processo e, em Unix, um bloqueio exclusivo de arquivo para que chamadas de ferramentas concorrentes e processos de servidor de teste não intercalem registros JSON.
Substitua o caminho do registro com ENHANCED_TERMINAL_CALL_LOG_PATH se necessário.
Padrões do Diretório de Trabalho
Se cwd for omitido, o padrão será .. Esse . é resolvido em relação ao diretório de trabalho do processo do servidor MCP fornecido pelo chamador/cliente. Na prática, quando o Codex inicia este servidor MCP a partir de um projeto, a omissão de cwd usa o diretório de inicialização do projeto/servidor. Passe cwd explicitamente quando precisar de um repositório ou subdiretório específico.
Exemplos de Ferramentas
enhanced_terminal
Execução síncrona básica (conclui rapidamente). cwd é opcional; omiti-lo usa o diretório de trabalho do processo do servidor MCP fornecido pelo chamador/cliente:
{
"command": "ls -la",
"cwd": ".",
"shell": "bash"
}
Comando de longa duração (alterna automaticamente para segundo plano após 50 segundos por padrão):
{
"command": "npm install",
"cwd": "./my-project",
"shell": "bash"
}
Força execução assíncrona imediata (útil para comandos interativos que precisam de stdin):
{
"command": "read -p 'stdin> ' value; echo received=$value",
"force_async": true
}
Com variáveis de ambiente:
{
"command": "npm run build",
"env_vars": {
"NODE_ENV": "production",
"API_KEY": "secret123"
}
}
Força execução síncrona (aguarda a conclusão):
{
"command": "cargo build --release",
"force_sync": true
}
Com lista de bloqueio personalizada:
{
"command": "docker run myimage",
"custom_denylist": ["docker rm", "docker system prune"]
}
Com tags para categorização de trabalhos:
{
"command": "cargo build --release",
"tags": ["build", "release"]
}
Pré-visualização limitada por tokens (tokenizador GPT-5/o200k_base):
{
"command": "cargo test",
"preview_tokens": 4000
}
preview_tokens tem padrão de 4096. Defina como 0 para desativar o truncamento de tokens para o buffer de pré-visualização limitado em memória.
Os IDs de trabalhos são identificadores legíveis do tipo adjetivo-substantivo-número, como brave-river-1, facilitando a cópia e a discussão em comparação com IDs numéricos.
enhanced_terminal_job_status
Obter saída completa. job_status retorna o resumo do comando por padrão; passe full_command: true apenas quando precisar do texto completo do comando:
{
"job_id": "brave-river-1",
"incremental": false,
"full_command": true
}
Obter saída incremental (apenas o que é novo desde a última verificação):
{
"job_id": "brave-river-1",
"incremental": true
}
Obter saída paginada (primeiros 1000 bytes):
{
"job_id": "brave-river-1",
"offset_bytes": 0,
"limit_bytes": 1000
}
Obter saída paginada (próximos 1000 bytes):
{
"job_id": "brave-river-1",
"offset_bytes": 1000,
"limit_bytes": 1000
}
enhanced_terminal_job_list
Listar todos os trabalhos:
{
"max_jobs": 50
}
Filtrar por status:
{
"max_jobs": 50,
"status_filter": ["Running", "Completed"]
}
Filtrar por tag:
{
"max_jobs": 50,
"tag_filter": "build"
}
Filtrar por diretório de trabalho:
{
"max_jobs": 50,
"cwd_filter": "/home/user/project"
}
Filtros combinados com ordem de classificação:
{
"max_jobs": 50,
"status_filter": ["Completed"],
"tag_filter": "test",
"sort_order": "oldest"
}
enhanced_terminal_job_cancel
{
"job_id": "brave-river-1"
}
enhanced_terminal_job_stdin
Escrever entrada em um trabalho assíncrono em execução. Novas linhas não são acrescentadas automaticamente, portanto inclua \n quando quiser submeter uma linha:
{
"job_id": "brave-river-1",
"input": "yes\n"
}
detect_binaries
{
"filter_categories": ["rust_tools", "python_tools"],
"max_concurrency": 16,
"version_timeout_ms": 1500,
"include_missing": false
}
Categorias de Binários
A ferramenta detect_binaries suporta filtragem por estas categorias:
package_managers- npm, pip, cargo, dnf, apt, snap, flatpak, brew, pnpm, uv, poetry, pipxrust_tools- cargo, rustc, rustfmt, clippy-driverpython_tools- python, python3, pip, pytest, black, ruff, mypy, uv, poetry, pipenv, pipx, pyright, pylint, flake8, isort, ipythonbuild_systems- make, cmake, ninja, gradle, maven, mvnc_cpp_tools- gcc, g++, clang, gdb, lldbjava_jvm_tools- java, javac, javadoc, jar, jarsigner, jconsole, jdeps, jlink, jshell, kotlin, kotlinc, scala, scalac, groovy, groovycmaven_tools- mvn, mvnw, mvndnode_js_tools- node, deno, bun, npm, yarn, pnpm, tsx, tsc, biome, prettier, eslintgo_tools- go, gofmteditors_dev- vim, nvim, emacs, code, hx, nano, microsearch_productivity- rg, fd, fzf, jq, bat, tree, exa, sd, zoxide, lsd, dust, btm, broot, choosesystem_perf- htop, ps, top, df, ducontainers- docker, podman, kubectl, helm, docker-compose, kind, minikube, skopeo, buildah, nerdctl, k9snetworking- curl, wget, dig, traceroute, http, nc, nmap, ss, ping, mtr, socatsecurity- openssl, gpg, ssh-keygen, age, sops, vault, passauth_helpers- zenity, ssh-askpass, sshaskpass, ksshaskpass, lxqt-openssh-askpass, gnome-ssh-askpass, x11-ssh-askpass, variantes de pinentrydatabases- sqlite3, psql, mysql, redis-cli, mongosh, duckdb, clickhouse-client, redis-servervcs- git, gh, lazygit, tig, gitui, hg, svncloud_cli- aws, gcloud, az, doctl, fly, vercel, wrangleriac_tools- terraform, tofu, pulumi, ansible, ansible-playbook, vagrant, packermedia_tools- ffmpeg, ffprobe, convert, magick, exiftool, yt-dlp, soxai_ml_tools- ollama, huggingface-cli, nvidia-smi, nvcc, rocm-smi, dvc, mlflowdocs_tools- pandoc, sphinx-build, mkdocs, doxygen, asciidoctor, mdbookruby_tools- ruby, gem, bundle, rake, irb, railsdotnet_tools- dotnet, nuget, msbuildcad_utils- ODAFileConverter, dwg2svg, dwg2SVG, dwg2bmp, dwg2pdf, qcad, librecad, freecad, freecadcmd, openscad, dxf2gcode
Desenvolvimento
Compilação
cargo build
Testes
cargo test
Executando Testes para Lista de Bloqueio
cargo test denylist
Executando Localmente
cargo run
Segurança
Lista de Bloqueio de Comandos
O servidor inclui uma lista de bloqueio abrangente que impede comandos perigosos:
Operações Destrutivas:
rm -rf /,rm -rf /*,rm --no-preserve-rootmkfs,dd if=/dev/zero, formatação de sistema de arquivos- Gravações em
/dev/sda,/dev/hda
Manipulação do Sistema:
shutdown,reboot,halt,poweroffinit 0,init 6, comandos de energia do systemctl
Bombas de Fork:
:(){:|:&};:e variantes
Alterações Perigosas de Permissões:
chmod 777 /,chmod -R 777 /chown -R root,chown root /
Riscos de Gerenciadores de Pacotes:
- Comandos de desinstalação forçada em apt, yum, dnf, pacman
Outros Riscos:
- Manipulação de módulos do kernel
- Exclusão de cron (
crontab -r) - Movimentação de diretórios do sistema
Lista de Bloqueio Personalizada
Você pode adicionar padrões personalizados por meio do parâmetro custom_denylist:
{
"command": "docker run myimage",
"custom_denylist": ["docker rm -f", "kubectl delete"]
}
Limite Assíncrono
Comandos que excedem o limite assíncrono do servidor (padrão: 50 segundos, configurável com ENHANCED_TERMINAL_ASYNC_THRESHOLD_SECS) alternam automaticamente para execução em segundo plano. Isso evita:
- Comandos de longa duração bloqueando o servidor MCP
- Problemas de tempo limite com instalações de pacotes
- Processos de build lentos travando a interface
Defina force_sync: true para desativar esse comportamento para comandos específicos. Defina force_async: true para retornar um ID de trabalho imediatamente sem aguardar o limite, que é o fluxo recomendado antes de usar enhanced_terminal_job_stdin.
Saída Incremental
Use enhanced_terminal_job_status com incremental: true para polling eficiente de tarefas de longa duração:
- A primeira chamada retorna toda a saída acumulada até o momento
- Chamadas subsequentes retornam apenas a nova saída desde a última verificação
- A posição de leitura é rastreada por job_id
- Redefina chamando com
incremental: false
Isso permite um comportamento semelhante a streaming sem infraestrutura real de streaming.
Entrada Interativa de Tarefas
Use enhanced_terminal_job_stdin para gravar no stdin do PTY de uma tarefa em execução depois que ela tiver sido movida para segundo plano. Para comandos que aguardam entrada, inicie-os com force_async: true para que a primeira chamada retorne um ID de tarefa imediatamente. A ferramenta de stdin grava exatamente a string input fornecida e não acrescenta uma nova linha automaticamente.
Paginação de Saída
Para saídas muito longas, use o modo de paginação em enhanced_terminal_job_status:
- Defina
offset_bytescomo a posição inicial em bytes - Defina
limit_bytescomo o número de bytes a selecionar (0 = todo o restante) - Retorna o sinalizador
has_moreetotal_length - Permite buscar em segmentos específicos sem recuperar a saída completa
Fluxo de trabalho de exemplo:
// Get first 1000 bytes
{"job_id": "brave-river-1", "offset_bytes": 0, "limit_bytes": 1000}
// Get next 1000 bytes
{"job_id": "brave-river-1", "offset_bytes": 1000, "limit_bytes": 1000}
// Get all remaining
{"job_id": "brave-river-1", "offset_bytes": 2000, "limit_bytes": 0}
Tags e Filtros de Tarefas
Marque as tarefas com tags ao criá-las para uma organização mais fácil:
{
"command": "cargo test",
"tags": ["test", "ci"]
}
Filtre tarefas por vários critérios em enhanced_terminal_job_list:
- status_filter: Corresponder a status específicos (ex.: ["Running", "Completed"])
- tag_filter: Mostrar apenas tarefas com uma tag específica
- cwd_filter: Mostrar apenas tarefas de um diretório específico
- sort_order: "newest" (padrão) ou "oldest"
Todos os filtros podem ser combinados para consultas poderosas.
Arquitetura
Este servidor usa uma estrutura modular com a edição Rust 2024:
src/main.rs- Ponto de entrada e inicialização do servidorsrc/server.rs- Implementação do servidor MCP com manipuladores de ferramentassrc/detection/- Lógica de detecção de binários e shellsrc/tools/- Execução de terminal, gerenciamento de tarefas, lista de bloqueio de segurança
Dependências
- rmcp 0.8 - SDK oficial em Rust para o Model Context Protocol
- tokio 1.x - Runtime assíncrono
- portable-pty 0.8 - Suporte a PTY multiplataforma para emulação de terminal
- serde/serde_json 1.x - Serialização
- schemars 1.0 - Geração de esquemas JSON para entradas de ferramentas
- anyhow 1.x - Tratamento de erros
- nix 0.29 - Tratamento de sinais Unix (somente Unix)
- tiktoken-rs 0.11 - Contagem de tokens compatível com GPT-5/o200k_base para visualizações
- chrono 0.4 - Carimbos de data/hora UTC para registro de chamadas
- tracing/tracing-subscriber 0.1/0.3 - Registro estruturado do servidor
Desempenho
- 16 verificações de binários concorrentes - Detecção rápida de ferramentas em paralelo (configurável)
- Alternância assíncrona inteligente - Segundo plano automático após 50s (configurável)
- Monitoramento em segundo plano com Tokio - As tarefas continuam em execução após a alternância assíncrona inteligente
- Captura incremental de saída - Consulte a nova saída com rastreamento de posição de leitura; paginação por bytes está disponível para logs longos
- Sem timeout por padrão - Defina a variável de ambiente ENHANCED_TERMINAL_TIMEOUT_SECS para habilitar
Configuração
Valores Padrão
- Shell:
bash - Diretório de Trabalho:
.resolvido a partir do diretório de trabalho do processo do servidor MCP fornecido pelo chamador/cliente - Tokens de Visualização:
4096tokens GPT-5/o200k_base (0desativa a truncagem de tokens) - Limite Assíncrono:
50segundos (ENHANCED_TERMINAL_ASYNC_THRESHOLD_SECS) - Timeout:
Nonepor padrão (ENHANCED_TERMINAL_TIMEOUT_SECShabilita um timeout) - IDs de Tarefas: identificadores legíveis
adjective-noun-number - Registro de Chamadas: JSONL seguro para concorrência em
enhanced_terminal_calls.jsonlna raiz do repositório (ENHANCED_TERMINAL_CALL_LOG_PATHsubstitui) - Concorrência Máxima de Detecção de Binários:
16 - Timeout de Sondagem de Versão:
1500ms
Licença
Licença MIT - consulte o arquivo LICENSE para obter detalhes