MCP Shell

Execute comandos seguros de shell a partir de assistentes de IA e outros clientes MCP, com configurações de segurança ajustáveis.

Documentação

mcp-shell

Trust Score glama

Servidor MCP que executa comandos de shell. Seu LLM recebe uma ferramenta; você tem controle sobre o que é executado e como.

Construído sobre mark3labs/mcp-go. Escrito em Go.


Execute

Docker (mais fácil):

docker run -it --rm -v /tmp/mcp-workspace:/tmp/mcp-workspace sonirico/mcp-shell:latest

A partir do código-fonte:

git clone https://github.com/sonirico/mcp-shell && cd mcp-shell
make install
mcp-shell

Configure

O modo seguro é o padrão. Sem arquivo de configuração, mcp-shell inicia em modo seguro e registra apenas ferramentas tipadas: leituras de arquivos, grep/glob, inspeção de git, e (opt-in) gravações de arquivos/git e scripts definidos pelo operador. Não há comando de shell bruto. Você só precisa de um arquivo de configuração para alterar os padrões abaixo. Para executar totalmente sem restrições, você deve optar explicitamente:

MCP_SHELL_ALLOW_UNSAFE=1 mcp-shell   # disables secure mode; the only tool is shell_exec

Para personalizar a política, aponte para uma configuração YAML:

export MCP_SHELL_SEC_CONFIG_FILE=/path/to/security.yaml
mcp-shell

Modo seguro (padrão) — apenas ferramentas tipadas, cada caminho confinado a working_directory:

security:
  enabled: true
  working_directory: /tmp/mcp-workspace
  max_execution_time: 30s
  max_output_size: 1048576
  run_as_user: ""
  audit_log: true

  # Expose file and git write tools (write_file, edit_file, mkdir, move,
  # delete, git_add, git_commit, git_switch, git_restore, git_stash). Off by
  # default.
  writes_enabled: false

  # Operator-defined scripts exposed through the run_script tool. The client
  # picks a name; the argv is yours and cannot be altered.
  # scripts:
  #   test: ["go", "test", "./..."]
  #   lint: ["golangci-lint", "run"]

Conecte

Claude Desktop — adicione à sua configuração MCP:

{
  "mcpServers": {
    "shell": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "sonirico/mcp-shell:latest"],
      "env": { "MCP_SHELL_LOG_LEVEL": "info" }
    }
  }
}

Para configuração personalizada, monte o arquivo e defina a variável de ambiente:

{
  "command": "docker",
  "args": ["run", "--rm", "-i", "-v", "/path/to/security.yaml:/etc/mcp-shell/security.yaml", "-e", "MCP_SHELL_SEC_CONFIG_FILE=/etc/mcp-shell/security.yaml", "sonirico/mcp-shell:latest"]
}

Ferramentas

O modo seguro (o padrão) registra estas ferramentas tipadas. * marca um parâmetro obrigatório.

FerramentaParâmetrosDisponível
read_filepath*, offset, limit, tailsempre
list_dirpath, depth, include_hiddensempre
globpattern*, path, newer_than, max_resultssempre
greppattern*, path, glob, ignore_case, context, files_only, count, max_resultssempre
statpath*sempre
diff_filespath_a*, path_b*sempre
system_infosempre
git_statussempre
git_logmax_count, ref, path, author, grep, since, until, oneline, followsempre
git_diffref, ref_to, staged, path, stat_only, name_onlysempre
git_showref, path, stat_onlysempre
git_blamepath*, ref, line_start, line_endsempre
git_branchesall, mergedsempre
git_tagspatternsempre
git_rev_parseref*sempre
git_ls_filespath, untrackedsempre
git_stash_listsempre
git_remotessempre
write_filepath*, content*, appendwrites_enabled
edit_filepath*, old_string*, new_string*, replace_allwrites_enabled
mkdirpath*writes_enabled
movefrom*, to*writes_enabled
deletepath*, recursivewrites_enabled
git_addpaths, allwrites_enabled
git_commitmessage*, allwrites_enabled
git_switchbranch*, createwrites_enabled
git_restorepaths*, stagedwrites_enabled
git_stashaction*, messagewrites_enabled
run_scriptname*scripts

Cada parâmetro de caminho é resolvido em relação a working_directory (symlinks seguidos); qualquer coisa fora disso é rejeitada. Caminhos e refs de git são passados posicionalmente e validados: um ref que começa com - é rejeitado. Não há ferramentas de rede; push, fetch e clone não são oferecidos.

Modo sem restrições: shell_exec existe apenas com MCP_SHELL_ALLOW_UNSAFE=1, executa o comando através de bash -c sem validação, por design, e é a única ferramenta registrada nesse modo.


Variáveis de ambiente

VariávelDescrição
MCP_SHELL_SEC_CONFIG_FILECaminho para o YAML de segurança (substitui os padrões seguros integrados)
MCP_SHELL_ALLOW_UNSAFEDefina 1 (ou true) para desativar o modo seguro e expor shell_exec em vez das ferramentas tipadas (opt-in)
MCP_SHELL_SERVER_NAMENome do servidor (padrão: "mcp-shell 🐚")
MCP_SHELL_LOG_LEVELdebug, info, warn, error, fatal
MCP_SHELL_LOG_FORMATjson, console
MCP_SHELL_LOG_OUTPUTstdout, stderr, file

Desenvolvimento

make install dev-tools   # deps + goimports, golines
make fmt test lint
make docker-build       # build image locally
make release            # binary + docker image

Segurança

  • Padrão: Modo seguro. O servidor constrói o argv de cada comando por conta própria; o cliente nunca fornece uma string de shell. Apenas ferramentas tipadas são registradas.
  • Confinamento de caminho: cada parâmetro de caminho é resolvido em relação a working_directory, symlinks seguidos, e qualquer coisa que resolva para fora dele é rejeitada.
  • Endurecimento de git: caminhos são passados após --, refs após --end-of-options, e um ref que começa com - é rejeitado. O git é executado com GIT_CONFIG_NOSYSTEM=1, GIT_CONFIG_GLOBAL=/dev/null, core.fsmonitor, core.pager e core.hooksPath neutralizados, e --no-ext-diff --no-textconv em log/diff/show/blame.
  • Ambiente mínimo: processos filhos recebem apenas PATH, HOME e LANG, nunca o ambiente do próprio servidor ou segredos de .env.
  • Gravações e scripts são opt-in: writes_enabled: true expõe as ferramentas de gravação de arquivos/git; um mapa scripts não vazio expõe run_script. Ambos estão desativados por padrão.
  • Sem restrições: apenas via MCP_SHELL_ALLOW_UNSAFE=1. A única ferramenta registrada é shell_exec, que executa bash -c sem validação. Adequado para desenvolvimento local, perigoso caso contrário.
  • Docker: Executa como não-root, baseado em Alpine. Use em produção. Melhor combinado com um sandbox de SO (sistema de arquivos somente leitura, capacidades removidas) como defesa em profundidade.

O modelo de ameaças, garantias e o escopo para relatórios de vulnerabilidades estão em SECURITY.md. Leia antes de abrir um advisory.


Migrando da versão 0.x

O modo seguro não valida mais uma string de comando shell_exec; ele expõe ferramentas tipadas em vez disso. O bloco security: de um arquivo de configuração não aceita mais:

Chave removidaSubstituição
use_shell_executionnão é necessário; ferramentas tipadas nunca fazem shell out
allowed_executablesnão é necessário; cada ferramenta executa um argv fixo construído pelo servidor
allowed_commandsnão é necessário; igual ao acima
blocked_commandsnão é necessário; igual ao acima
blocked_patternsnão é necessário; igual ao acima

Carregar um arquivo de configuração que ainda define um desses falha na inicialização com um erro nomeando a chave. Não há mais "modo legado" e nenhum exemplo de security-legacy.yaml. Se você precisar de acesso bruto ao shell, defina MCP_SHELL_ALLOW_UNSAFE=1 para obter shell_exec de volta; ele não é mais restringido pelo bloco security: de forma alguma.


Contribuindo

Faça um fork, crie um branch, make fmt test, abra um PR.