sftp-mcp
Accesses client SFTP servers — as illustrated by TOTVS Protheus setups (e.g. /totvs/protheus/apo and /totvs/protheus/bin/appserver write roots, TOTVS TSpace client field) — to browse, read, tail logs, search, and download files, plus approved write operations (upload with backup, create folder, rename/move) scoped to per-profile write roots.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sftp-mcp list the files in /totvs/protheus/apo on cliente-prod"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| cadastro | Abre uma janela para você informar URL, usuário e senha |
| leitura | Lista os perfis cadastrados, sem segredo |
| leitura | Lista uma pasta, com filtro glob opcional |
| leitura | Tipo, tamanho, datas e permissões |
| leitura | Lê texto por faixa de linhas, até o limite do perfil (padrão 1 MB) |
| leitura | Final de log sem ler o arquivo inteiro |
| leitura | Busca por nome, até a profundidade do perfil (padrão 5) |
| leitura | Copia o arquivo para a pasta local do perfil, sem sobrescrever |
| escrita | Envia arquivo local; sobrescrever exige |
| escrita | Cria pasta |
| escrita | Renomeia ou move, sem nunca sobrescrever |
| 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 nosettings.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, useraizes_escritae 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_escritano 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/confige 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.logA 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_mcpA 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_developmentviradev), 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-prodOs 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 = 2000Chave privada no formato PuTTY (.ppk) não é aceita. No PuTTYgen: Load, depois Conversions > Export OpenSSH key.
Testes
pip install -e .[teste]
python -m pytestOs 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 toolssftp_baixarARead-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_buscarBRead-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_enviarADestructive
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_infoBRead-only
Tipo, tamanho, datas e permissoes de um arquivo ou pasta do servidor.
Inputs: perfil (required), caminho (required).
sftp_lerARead-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_listarBRead-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_perfisARead-only
Lista os perfis cadastrados (sem segredo): host, ambiente, repositorio vinculado e raizes.
Inputs: no named parameters. Returns: result
sftp_renomearADestructive
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_linhasBRead-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
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
Work on your own computers from Claude or ChatGPT: run commands, edit and search files.
Give Claude only the Google Drive files you choose. Every action logged.
Find, read, create and edit Plainer files with Claude Code or Codex. Approve access in your browser.
1Safe folder access for ChatGPT and Claude: read, write and search files, risky tools opt-in.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables SSH remote access to servers through Claude, allowing users to execute commands, transfer files via SFTP, and manage multiple remote connections using natural language.129MIT
- AlicenseAqualityDmaintenanceEnables Claude to connect to servers via SSH, execute commands, transfer files, and manage connections through natural language.911 npm1MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables Claude Code to control remote servers via SSH for automated deployment, testing, and operations, including command execution and file transfer.4-
- AlicenseAqualityDmaintenanceEnables FTP file operations such as upload, download, list, and delete directly from Claude Desktop or Claude CLI.15MIT