sftp-helper
Provides SFTP file operations (upload, download, check existence, create directories) via MCP tools.
README
SFTP Helper
SFTP Helper belongs to a collection of libraries called AI Helpers developped for building Artificial Intelligence
This toolbox requires:
- a
config.jsonfor the sftp parameters (or YAML or environment variables or .env) - that you previously added you SSH key of your local machine in the SFTP server
SFTP Helper is a Python library that provides utility functions for working with SFTP servers via paramiko. Host key verification is on by default โ ~/.ssh/known_hosts is loaded and unknown hosts are rejected.
Installation
Prerequisites โ Python 3.10โ3.13 and git, cross-platform:
- ๐ macOS (Homebrew):
brew install python git - ๐ง Ubuntu/Debian:
sudo apt update && sudo apt install -y python3 python3-pip git - ๐ช Windows (PowerShell):
winget install Python.Python.3.12 Git.Git
Then install the package:
Install Package
We can recommand python environments. Check this link if you don't know how
pip install --force-reinstall --no-cache-dir git+https://github.com/warith-harchaoui/sftp-helper.git@v2.2.2
Or, from a checkout:
pip install -r requirements.txt
pip install -e .
Write your own configuration file
A ready-to-fill template is committed at sftp_config.json.example. Copy it to sftp_config.json and edit in place โ real *config.json files are gitignored so you cannot accidentally commit secrets:
cp sftp_config.json.example sftp_config.json
# then edit sftp_config.json with your credentials
You may also provide a YAML version (sftp_config.yaml), environment variables, or an .env file โ sftp-helper falls back in that order via os_helper.get_config:
JSON
{
"sftp_host": "<sftp_host>",
"sftp_login": "<sftp_login>",
"sftp_passwd": "<sftp_passwd>",
"sftp_https": "<sftp_https>",
"sftp_destination_path": "<sftp_destination_path>",
}
or
YAML
sftp_host: "<sftp_host>"
sftp_login: "<sftp_login>"
sftp_passwd: "<sftp_passwd>"
sftp_https: "<sftp_https>"
sftp_destination_path: "<sftp_destination_path>"
or
ENVIRONMENT VARIABLES
SFTP_HOST="<sftp_host>" \
SFTP_LOGIN="<sftp_login>" \
SFTP_PASSWD="<sftp_passwd>" \
SFTP_HTTPS="<sftp_https>" \
SFTP_DESTINATION_PATH="<sftp_destination_path>" \
python <your_python_script>
or
.env
SFTP_HOST = <sftp_host>
SFTP_LOGIN = <sftp_login>
SFTP_PASSWD = <sftp_passwd>
SFTP_HTTPS = <sftp_https>
SFTP_DESTINATION_PATH = <sftp_destination_path>
In which you can find these information in your favorite FTP tool (mine is FileZilla):
<sftp_host>is the server pathsftp....<sftp_login>and<sftp_passwd>that you use in FileZilla<sftp_destination_path>is the remote folder path<sftp_https>corresponds to the web URL of<sftp_destination_path>- <your_python_script> is your python script :)
Usage
For the full catalog of recipes (uploads, downloads, existence checks, recursive directory creation, temporary remote files with auto-cleanup, strict host-key verification), see ๐ EXAMPLES.md.
Here's an example of how to use SFTP helper (won't work without a valid path/to/sftp_config.json):
import sftp_helper as sftph
import os_helper as osh
# Write a small text file
local_file = "example.txt"
with open(local_file, "wt") as f:
f.write("A small example of text")
# Load creds from JSON / YAML file, or fall back to .env / environment vars.
cred = sftph.credentials("path/to/sftp_config.json")
remote_file = cred["sftp_destination_path"] + "/" + local_file
url = cred["sftp_https"] + "/" + local_file
# upload() raises on failure and returns the destination URL on success.
sftph.upload(local_file, cred, remote_file)
print(f"Uploaded {local_file} to {remote_file}")
# Uploaded example.txt to /remote/base/path/example.txt
assert osh.is_working_url(url), f"URL not reachable: {url}"
print(f"URL is live: {url}")
# URL is live: https://files.example.com/example.txt
Temporary remote files
If you need a unique remote path that gets cleaned up automatically, use the
remote_tempfile context manager:
import sftp_helper as sftph
import os_helper as osh
credentials = sftph.credentials("path/to/sftp_config.json")
with sftph.remote_tempfile(credentials, ext="txt") as (sftp_address, url):
sftph.upload("local.txt", credentials, sftp_address)
assert osh.is_working_url(url)
# On exit, the remote file is deleted.
Host key verification
sftp_helper never disables host key verification. The default policy is
paramiko.RejectPolicy() and ~/.ssh/known_hosts is loaded automatically. To
trust a server in a non-default location, point at an extra known_hosts file
via the optional sftp_known_hosts credential.
Multi-surface exposure
sftp-helper is not just a library โ the same functions are exposed
as a CLI, a FastAPI HTTP surface, and an MCP tool set:
# Python library (default)
import sftp_helper as sftph
# argparse-based CLI (installed automatically)
sftp-helper upload --config sftp_config.json --input local.txt --remote /uploads/local.txt
sftp-helper download --config sftp_config.json --remote /uploads/local.txt --output out.txt
sftp-helper exists --config sftp_config.json --remote /uploads/local.txt
sftp-helper mkdir --config sftp_config.json --remote /uploads/a/b/c
# click-based CLI twin (needs the [cli] extra)
pip install 'sftp-helper[cli] @ git+https://github.com/warith-harchaoui/sftp-helper.git@v2.2.2'
sftp-helper-click upload --config sftp_config.json --input local.txt --remote /uploads/local.txt
# FastAPI HTTP surface (needs the [api] extra)
pip install 'sftp-helper[api] @ git+https://github.com/warith-harchaoui/sftp-helper.git@v2.2.2'
SFTP_HELPER_CONFIG=./sftp_config.json uvicorn sftp_helper.api:app --port 8000
# โ OpenAPI docs at http://localhost:8000/docs
# MCP tools over FastAPI (needs the [api,mcp] extras)
pip install 'sftp-helper[api,mcp] @ git+https://github.com/warith-harchaoui/sftp-helper.git@v2.2.2'
sftp-helper-mcp # serves FastAPI + MCP on port 8000
Docker image (HTTP + MCP on port 8000):
docker build -t sftp-helper .
docker run --rm -p 8000:8000 \
-v $PWD/sftp_config.json:/app/sftp_config.json:ro \
-e SFTP_HELPER_CONFIG=/app/sftp_config.json \
sftp-helper
An innovative GUI plan (pipeline dashboard, storage health panel, live transfer feed) lives in GUI.md.
The competitive landscape (paramiko, pysftp, asyncssh, Fabric, smart-open, PyFilesystem2, lftp, Rclone, โฆ) is analysed in LANDSCAPE.md.
Author
Acknowledgements
Special thanks to Mohamed Chelali and Bachir Zerroug for fruitful discussions.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
