Skip to main content
Glama

sftp-mcp

Servidor MCP para acessar, pelo Claude Code, o SFTP do TCloud, da TOTVS. Foi pensado para esse acesso: você cadastra a URL, o usuário e a senha que o TCloud mostra, e o resto já vem pronto. A leitura é livre. Toda escrita pede a sua aprovação, inclusive com --dangerously-skip-permissions.

O que ele faz

Tool

Tipo

O que faz

sftp_cadastrar

cadastro

Abre uma janela para você informar URL, usuário e senha

sftp_perfis

leitura

Lista os perfis cadastrados, sem segredo

sftp_listar

leitura

Lista uma pasta, com filtro glob opcional

sftp_info

leitura

Tipo, tamanho, datas e permissões

sftp_ler

leitura

Lê texto por faixa de linhas, até o limite do perfil (padrão 1 MB)

sftp_ultimas_linhas

leitura

Final de log sem ler o arquivo inteiro

sftp_buscar

leitura

Busca por nome, até a profundidade do perfil (padrão 5)

sftp_baixar

leitura

Copia o arquivo para a pasta local do perfil, sem sobrescrever

sftp_enviar

escrita

Envia arquivo local; sobrescrever exige sobrescrever=true e faz backup antes

sftp_criar_pasta

escrita

Cria pasta

sftp_renomear

escrita

Renomeia ou move, sem nunca sobrescrever

sftp_vincular_repositorio

escrita

Define o repositório local do cliente

Não existe tool de apagar.

Related MCP server: claude-ssh-mcp

Travas

  • Aprovação em toda escrita. As tools de escrita declaram _meta["anthropic/requiresUserInteraction"]: true, e o Claude Code mostra o prompt de permissão em toda chamada, sem "não perguntar de novo". Isso vem no código: não precisa configurar nada, e foi testado com --dangerously-skip-permissions, sem nenhuma regra no settings.json.

  • Só o Claude Code garante esse prompt. A marca requiresUserInteraction é dele, e o servidor não confere se houve aprovação. Em outro cliente MCP, use raizes_escrita e não conte com a confirmação.

  • Raízes de escrita (opcional). Por padrão a escrita vale em qualquer pasta que o usuário SFTP alcance, sempre com aprovação. Para limitar, declare raizes_escrita no perfil. O caminho é resolvido pelo servidor (realpath) antes da checagem, então .. e symlink não saem da raiz. Escrever sobre um symlink é recusado em qualquer caso.

  • Host key fixada. A chave pública do servidor é gravada no cadastro. Chave nova pede a sua confirmação; chave já aceita em outro perfil entra direto, porque vários ambientes do TCloud ficam atrás do mesmo gateway. Se o servidor apresentar outra depois, a conexão é recusada. O ~/.ssh/known_hosts, o ~/.ssh/config e o agente SSH não são usados.

  • Segredo fora do modelo. A senha é digitada na janela de cadastro, que roda em processo próprio, e vai direto para o keyring do sistema (Credential Manager no Windows). Ela nunca é parâmetro de tool e não volta na resposta.

  • Tudo auditado. Cada operação gera uma linha JSON em audit.log, sem conteúdo de arquivo e sem segredo.

Pasta local do cliente

Cada perfil aponta para o repositório git do cliente na sua máquina. Downloads, backups e auditoria ficam em:

<repositório>/.claude/sftp/<perfil>/
├── downloads/   espelha o caminho remoto
├── backups/     <data-hora>/<caminho remoto>, versão anterior de cada arquivo sobrescrito
└── audit.log

A pasta .claude/ não pode entrar no git do cliente. Ao vincular, o servidor roda git check-ignore e avisa se ela não estiver ignorada.

Se o perfil não tiver repositório, as tools falham pedindo que o agente pergunte a pasta a você e chame sftp_vincular_repositorio.

Instalação

Requer Python 3.11 ou superior.

git clone https://github.com/guipegoraro/sftp-mcp
cd sftp-mcp
pip install -e .

Registre no Claude Code (escopo de usuário):

claude mcp add -s user sftp -- python -P -m sftp_mcp

A aprovação de escrita já vem ativa, sem configuração no settings.json.

Cadastro de perfis

Peça ao Claude para cadastrar o ambiente. Ele chama sftp_cadastrar e abre uma janela com o nome do perfil e o repositório já preenchidos. Informe:

  • URL, como o TCloud mostra: sftp://host:porta, com a rota no final se houver (sftp://host:porta/pasta). A rota vira a pasta inicial do perfil.

  • Usuário e senha.

  • Ambiente: vem deduzido do usuário (ftp_XXXXXX_development vira dev), e dá para trocar.

Ao salvar, a janela testa o login e só então grava. Senha errada não deixa nada gravado.

Sem tela disponível, ou para os demais ajustes, use o CLI:

sftp-mcp-setup adicionar cliente-prod     # mesmo cadastro, pelo terminal
sftp-mcp-setup listar
sftp-mcp-setup testar cliente-prod
sftp-mcp-setup definir-senha cliente-prod
sftp-mcp-setup trocar-fingerprint cliente-prod
sftp-mcp-setup vincular-repositorio cliente-prod C:\caminho\do\repo
sftp-mcp-setup remover cliente-prod

Os perfis ficam em ~/.sftp-mcp/perfis.toml (ou na pasta de SFTP_MCP_HOME). Dá para editar à mão:

[perfis.cliente-prod]
host = "cliente123456.protheus.cloudtotvs.com.br"
porta = 10501
usuario = "ftp_XXXXXX_production"
host_key = "ssh-ed25519 AAAA..."
autenticacao = "senha"          # ou "chave", com chave_privada = "C:\\caminho\\id_ed25519"
chave_privada = ""
ambiente = "prod"               # prod, hml ou dev
tspace_cliente = ""
repositorio = "C:\\caminho\\do\\repo"
pasta_inicial = ""              # rota da URL; caminhos relativos partem dela
raizes_leitura = []             # vazio = servidor inteiro
raizes_escrita = []             # vazio = qualquer pasta, sempre com aprovacao
timeout_conexao = 15
ocioso_max_segundos = 300
max_leitura_bytes = 1048576
busca_profundidade = 5
busca_max_resultados = 2000

Chave privada no formato PuTTY (.ppk) não é aceita. No PuTTYgen: Load, depois Conversions > Export OpenSSH key.

Testes

pip install -e .[teste]
python -m pytest

Os testes sobem um servidor SFTP do asyncssh no próprio processo e usam um keyring em memória. Eles não acessam servidor real.

Limites conhecidos

  • Só SFTP. FTP e FTPS não são suportados.

  • Sem jump host. VPN fica por sua conta.

  • Quem roda código como o seu usuário do Windows lê o Credential Manager. Veja SECURITY.md.

Available Tools

12 tools
sftp_baixarA
Read-only

Baixa um arquivo para /.claude/sftp//downloads/, espelhando o caminho remoto. Nunca sobrescreve: arquivo repetido ganha sufixo (1), (2)...

Inputs: perfil (required), caminho (required).

sftp_buscarB
Read-only

Busca por nome (glob, sem diferenciar maiusculas) a partir de uma pasta, descendo ate a profundidade maxima do perfil (padrao 5). Nao segue link de pasta.

Inputs: perfil (required), caminho (required), tipo, padrao, +1 more.

sftp_cadastrarA

Abre uma janela na tela do usuario para cadastrar um ambiente: URL, usuario, senha e ambiente. perfil e repositorio chegam preenchidos para conferencia (ex.: "cbm-dev" e a pasta do repositorio do cliente). Espera o usuario salvar ou cancelar. A senha nao volta nesta resposta.

Inputs: perfil, repositorio.

sftp_criar_pastaB

Cria uma pasta no servidor. Respeita raizes_escrita, se o perfil tiver. criar_pais cria as pastas intermediarias que faltarem.

Inputs: perfil (required), caminho (required), criar_pais.

sftp_enviarA
Destructive

Envia um arquivo local ao servidor. caminho_remoto terminado em "/" ou que seja pasta recebe o nome do arquivo local. Respeita raizes_escrita, se o perfil tiver. Se o destino existe, exige sobrescrever=true e baixa a versao atual para backups/ antes de substituir.

Inputs: perfil (required), arquivo_local (required), caminho_remoto (required), sobrescrever.

sftp_infoB
Read-only

Tipo, tamanho, datas e permissoes de um arquivo ou pasta do servidor.

Inputs: perfil (required), caminho (required).

sftp_lerA
Read-only

Le um arquivo de texto do servidor, a partir de linha_inicial, ate max_linhas ou o limite de bytes do perfil. encoding vazio detecta UTF-8 e cai para CP1252; informe para forcar (ex.: "cp1252"). Arquivo binario devolve so os metadados.

Inputs: perfil (required), caminho (required), encoding, max_linhas, +1 more.

sftp_listarB
Read-only

Lista uma pasta do servidor. caminho relativo parte da pasta inicial do usuario SFTP. padrao filtra por nome no estilo glob (ex.: "*.log"), sem diferenciar maiusculas.

Inputs: perfil (required), padrao, caminho.

sftp_perfisA
Read-only

Lista os perfis cadastrados (sem segredo): host, ambiente, repositorio vinculado e raizes.

Inputs: no named parameters. Returns: result

sftp_renomearA
Destructive

Renomeia ou move um arquivo ou pasta. Respeita raizes_escrita, se o perfil tiver. Nunca sobrescreve: falha se o destino existir.

Inputs: origem (required), perfil (required), destino (required).

sftp_ultimas_linhasB
Read-only

Ultimas linhas de um arquivo de texto (console.log, error.log), sem ler o arquivo inteiro.

Inputs: perfil (required), caminho (required), linhas, encoding.

sftp_vincular_repositorioB

Define o repositorio git local do cliente, onde ficam downloads, backups e auditoria do perfil (/.claude/sftp//). Use o caminho que o usuario informou.

Inputs: perfil (required), caminho_repositorio (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 12 tools

    Disambiguation4/5

    The tools mostly target clearly distinct SFTP operations: read, tail, search, list, download, upload, mkdir, rename, stat, and profile management. The only mild overlap is between sftp_ler and sftp_ultimas_linhas, but the descriptions make the specialized tailing use case clear.

    Naming Consistency4/5

    All tools use a consistent sftp_ prefix and lowercase snake_case, which makes the surface predictable. The internal pattern varies between verb-only (ler, listar), noun-only (info, perfis), and verb_noun (criar_pasta, vincular_repositorio), but this is a minor deviation rather than confusion.

    Tool Count5/5

    Twelve tools is well scoped for an SFTP server with profile management. Each tool maps to a meaningful file, directory, search, or configuration operation without obvious filler.

    Completeness3/5

    The surface covers reading, tailing, searching, listing, downloading, uploading, creating folders, renaming/moving, stat, and profile setup. However, there is no delete/remove operation for files or folders, and permissions/chmod are absent, leaving notable lifecycle gaps.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables SSH remote access to servers through Claude, allowing users to execute commands, transfer files via SFTP, and manage multiple remote connections using natural language.
      12
      9
      MIT
    • -
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables Claude Code to control remote servers via SSH for automated deployment, testing, and operations, including command execution and file transfer.
      4
      -
    • A
      license
      A
      quality
      D
      maintenance
      Enables FTP file operations such as upload, download, list, and delete directly from Claude Desktop or Claude CLI.
      15
      MIT