append-file
Append content to the end of a file on the FTP server (creates the file if it does not exist). Pass encoding "base64" for binary content.
List, read, write and edit files on an FTP, FTPS or SFTP server without leaving the conversation.
LABSCO SUMMARY
edit-file is what separates this from a plain FTP wrapper: an exact string is replaced in place, so fixing a line in a config on a remote host stops meaning download, edit, push the whole thing back. The credential handling is the other half — SSH keys can come from 1Password by reference rather than from disk, and username, password and passphrase can sit in the config as encrypted enc: values with the key in the OS keychain, which is what stops a client config being a plaintext credential store.
A file-management client for FTP, FTPS and SFTP: directory listings, binary-safe uploads and downloads, exact-text edits in place, appends, renames and moves, directory creation and deletion — over whichever of the three protocols the server speaks.
Node.js 18.14 or newer, run with npx -y mcp-server-ftp over stdio. FTP_HOST, FTP_PORT, FTP_USER and FTP_PASSWORD identify the server; FTP_PROTOCOL picks ftp or sftp, and FTP_SECURE=true enables TLS — which only means anything on the ftp path, since SFTP is encrypted already. For SFTP, FTP_PRIVATE_KEY_PATH takes either a key path or an op:// 1Password reference, which needs the 1Password CLI installed and already authenticated, and FTP_PASSPHRASE unlocks the key. To keep plaintext credentials out of a client config, store them in the enc: format under a 64-character hex FTP_ENCRYPTION_KEY, and hold that key in the OS keychain rather than beside the values it protects. Uploads, downloads and appends may use short-lived local temporary files, removed after each operation.
One command plus credentials — npx -y @smithery/cli install alxspikers-team/mcp-server-ftp --client claude, then supply credentials
USE CASES
Replace the exact string in place instead of downloading the file and pushing the whole thing back.
Create the directory, upload the files — base64 for the binaries — and read the listing back.
Download the file and read it; binary content comes back base64-encoded.
Append to the end of the file, which is created if it is not there yet.
Rename or move the files and directories, then delete what is left over.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
append-fileAppend content to the end of a file on the FTP server (creates the file if it does not exist). Pass encoding "base64" for binary content.
create-directoryCreate a new directory on the FTP server
delete-directoryDelete a directory from the FTP server
delete-fileDelete a file from the FTP server
download-fileDownload a file from the FTP server. Text files are returned as-is; binary files are returned base64-encoded.
edit-fileEdit a text file on the FTP server by replacing an exact string, without re-uploading the whole file content. oldText must match exactly (including whitespace) and be unique in the file unless replaceAll is set.
list-directoryList contents of an FTP directory
rename-fileRename or move a file or directory on the FTP server
upload-fileUpload a file to the FTP server. Pass encoding "base64" to upload binary content.
BEFORE YOU INSTALL
9 tools when we connected. The same nine work over every protocol; FTP_PROTOCOL and FTP_SECURE change only the transport. Most of them write to the remote server, including edit-file, rename-file, delete-file and delete-directory.
CONTEXT COST
Rated by the size of the 9 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
npx -y @smithery/cli install alxspikers-team/mcp-server-ftp --client claudeFor FTPS add "FTP_SECURE": "true"; for SFTP set "FTP_PROTOCOL": "sftp", "FTP_PORT": "22" and "FTP_PRIVATE_KEY_PATH" (and "FTP_PASSPHRASE" if the key has one) — the same variables as the local-build tabs.
{
"mcpServers": {
"ftp-server": {
"command": "npx",
"args": [
"-y",
"mcp-server-ftp"
],
"env": {
"FTP_HOST": "<YOUR_FTP_HOST>",
"FTP_PORT": "21",
"FTP_PROTOCOL": "ftp",
"FTP_USER": "<YOUR_FTP_USER>",
"FTP_PASSWORD": "<YOUR_FTP_PASSWORD>"
}
}
}
}Build from source
git clone https://github.com/alxspiker/mcp-server-ftp.git
cd mcp-server-ftp
npm install
npm run buildAdd the server to your client, with the absolute path of that folder
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": [
"<YOUR_PATH_TO_MCP_SERVER_FTP>/build/index.js"
],
"env": {
"FTP_HOST": "<YOUR_FTP_HOST>",
"FTP_PORT": "21",
"FTP_PROTOCOL": "ftp",
"FTP_USER": "<YOUR_FTP_USER>",
"FTP_PASSWORD": "<YOUR_FTP_PASSWORD>"
}
}
}
}Build from source
git clone https://github.com/alxspiker/mcp-server-ftp.git
cd mcp-server-ftp
npm install
npm run buildAdd the server to your client, with the absolute path of that folder
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": [
"<YOUR_PATH_TO_MCP_SERVER_FTP>/build/index.js"
],
"env": {
"FTP_HOST": "<YOUR_FTP_HOST>",
"FTP_PORT": "21",
"FTP_PROTOCOL": "ftp",
"FTP_SECURE": "true",
"FTP_USER": "<YOUR_FTP_USER>",
"FTP_PASSWORD": "<YOUR_FTP_PASSWORD>"
}
}
}
}Build from source
git clone https://github.com/alxspiker/mcp-server-ftp.git
cd mcp-server-ftp
npm install
npm run buildAdd the server to your client, with the absolute path of that folder
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": [
"<YOUR_PATH_TO_MCP_SERVER_FTP>/build/index.js"
],
"env": {
"FTP_HOST": "<YOUR_FTP_HOST>",
"FTP_PORT": "22",
"FTP_PROTOCOL": "sftp",
"FTP_USER": "<YOUR_FTP_USER>",
"FTP_PRIVATE_KEY_PATH": "~/.ssh/id_ed25519",
"FTP_PASSPHRASE": "<YOUR_FTP_PASSPHRASE>"
}
}
}
}