An MCP (Model Context Protocol) server for FTP file operations. Browse, read, download, upload, and manage files on remote FTP servers.
Built with Rust, rmcp, and suppaftp.
- Multi-profile support — configure multiple FTP servers and switch between them
- Full file management — list, read, download, upload, delete, rename, and create directories
- Recursive operations — download or upload entire directory trees
- Binary-safe — binary transfer mode for downloads/uploads, hex preview for non-text files via
read_file - Passive/active mode — configurable per profile
- Connect-per-call — each tool opens a fresh FTP connection, so there's no stale session state. Recursive operations hold one connection for the full traversal.
| Tool | Description |
|---|---|
list_profiles |
List configured FTP server profiles (no passwords shown) |
list_directory |
List files/dirs at a remote path (type, size, date, name) |
read_file |
Read a remote file and return contents as text |
download_file |
Download a single remote file to a local path |
upload_file |
Upload a local file to a remote path |
download_directory |
Recursively download a remote directory |
upload_directory |
Recursively upload a local directory |
delete |
Delete a remote file or empty directory |
rename |
Rename or move a remote file or directory |
mkdir |
Create a remote directory |
All tools accept an optional profile parameter. When omitted, the default_profile from config is used.
Create a TOML config file at ~/.config/mcp-server-ftp/config.toml:
default_profile = "myserver"
[[profiles]]
name = "myserver"
host = "ftp.example.com"
port = 21
username = "user"
password = "pass"
tls = false
passive = true
timeout_secs = 30You can define multiple [[profiles]] blocks to manage several FTP servers.
| Field | Default | Description |
|---|---|---|
name |
(required) | Profile name used to reference this server |
host |
(required) | FTP server hostname or IP |
port |
21 |
FTP port |
username |
"" |
FTP username |
password |
"" |
FTP password |
tls |
false |
Enable TLS (not yet implemented) |
passive |
true |
Use passive mode |
timeout_secs |
30 |
Connection timeout in seconds |
Requires Rust 2024 edition (1.85+).
cargo build --releaseThe binary is output to target/release/mcp-server-ftp.
Add to your MCP server configuration:
{
"mcpServers": {
"ftp": {
"command": "/path/to/mcp-server-ftp"
}
}
}Enable debug logging with the RUST_LOG environment variable:
{
"mcpServers": {
"ftp": {
"command": "/path/to/mcp-server-ftp",
"env": {
"RUST_LOG": "debug"
}
}
}
}src/
main.rs — Entry point: config load, tracing init, stdio transport
config.rs — TOML config parsing, multi-profile support
server.rs — MCP tool definitions via rmcp #[tool_router]
ftp.rs — Async FTP client wrapper (connect, list, read, download, upload, delete, rename, mkdir)
MIT