Install
openclaw skills install ftp-client-phpFTP/FTPS file manager via PHP proxy. Supports list, upload, download, delete, move, copy, mkdir, read, write. Works behind NAT/firewalls (e.g. HuggingFace) b...
openclaw skills install ftp-client-phpFull-featured FTP/FTPS client skill for OpenClaw. Routes all FTP operations through an HTTP PHP proxy server, so it works even when direct FTP connections are blocked (e.g. HuggingFace Spaces, serverless environments). Click to deploy ftp-php-proxy.
OpenClaw ──HTTP──▶ PHP Proxy Server (api.php) ──FTP──▶ FTP Server
Set FTP_PHP_CONFIG in the OpenClaw skill management panel. JSON format:
{"ftp_php_domain":"https://your-server.com/api.php","ftp_php_apikey":"","ftp_client_host":"ftp.example.com","ftp_client_port":"21","ftp_client_username":"user","ftp_client_password":"pass","ftp_client_connect_mode":"passive","ftp_client_protocol":"ftps","ftp_client_encrypt_mode":"explicit"}
Field definitions:
ftp_php_domain (required): Full URL of the PHP proxy api.php endpointftp_php_apikey (optional): API key for the PHP proxy, empty string = no authftp_client_host (required): FTP server hostnameftp_client_port (optional): FTP server port, default 21ftp_client_username (required): FTP login usernameftp_client_password (required): FTP login passwordftp_client_connect_mode (optional): active or passive, default passiveftp_client_protocol (optional): ftp or ftps, default ftpftp_client_encrypt_mode (optional): explicit or implicit, only meaningful when protocol is ftpsExample (alwaysdata FTPS):
{"ftp_php_domain":"https://your-server.com/api.php","ftp_php_apikey":"","ftp_client_host":"ftp.example.com","ftp_client_port":"21","ftp_client_username":"user","ftp_client_password":"pass","ftp_client_connect_mode":"passive","ftp_client_protocol":"ftps","ftp_client_encrypt_mode":"explicit"}
node {baseDir}/scripts/list.mjs
node {baseDir}/scripts/list.mjs "/remote/path"
node {baseDir}/scripts/list.mjs "/" --detailed
Options:
--detailed or -l: Show detailed file info (size, date, permissions, type)node {baseDir}/scripts/download.mjs "/remote/file.txt"
node {baseDir}/scripts/download.mjs "/remote/file.txt" --out "/local/save/path.txt"
Options:
--out <path> or -o <path>: Local save path (default: system temp directory)node {baseDir}/scripts/upload.mjs "/local/file.txt" --to "/remote/path/file.txt"
Options:
--to <path> or -t <path>: Remote destination path (required)node {baseDir}/scripts/write.mjs "/remote/file.txt" "file content here"
node {baseDir}/scripts/write.mjs "/remote/file.txt" --stdin < local_file.txt
node {baseDir}/scripts/read.mjs "/remote/file.txt"
node {baseDir}/scripts/delete.mjs "/remote/file.txt"
node {baseDir}/scripts/delete.mjs "/remote/dir" --dir
Options:
--dir or -d: Remove directory recursivelynode {baseDir}/scripts/move.mjs "/remote/old.txt" "/remote/new.txt"
node {baseDir}/scripts/copy.mjs "/remote/source.txt" "/remote/dest.txt"
node {baseDir}/scripts/mkdir.mjs "/remote/new-dir"
node {baseDir}/scripts/info.mjs "/remote/file.txt"
upload_max_filesize and memory_limit.FTP_PHP_CONFIG env var as a single-line JSON string.