FTP Client (PHP Proxy)
Full-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.
Architecture
OpenClaw ──HTTP──▶ PHP Proxy Server (api.php) ──FTP──▶ FTP Server
Environment Variable
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, default21ftp_client_username(required): FTP login usernameftp_client_password(required): FTP login passwordftp_client_connect_mode(optional):activeorpassive, defaultpassiveftp_client_protocol(optional):ftporftps, defaultftpftp_client_encrypt_mode(optional):explicitorimplicit, only meaningful when protocol isftps
Example (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"}
List directory
node {baseDir}/scripts/list.mjs
node {baseDir}/scripts/list.mjs "/remote/path"
node {baseDir}/scripts/list.mjs "/" --detailed
Options:
--detailedor-l: Show detailed file info (size, date, permissions, type)
Download file
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)
Upload file
node {baseDir}/scripts/upload.mjs "/local/file.txt" --to "/remote/path/file.txt"
Options:
--to <path>or-t <path>: Remote destination path (required)
Write text content to remote file
node {baseDir}/scripts/write.mjs "/remote/file.txt" "file content here"
node {baseDir}/scripts/write.mjs "/remote/file.txt" --stdin < local_file.txt
Read file content
node {baseDir}/scripts/read.mjs "/remote/file.txt"
Delete file or directory
node {baseDir}/scripts/delete.mjs "/remote/file.txt"
node {baseDir}/scripts/delete.mjs "/remote/dir" --dir
Options:
--diror-d: Remove directory recursively
Move / Rename
node {baseDir}/scripts/move.mjs "/remote/old.txt" "/remote/new.txt"
Copy file
node {baseDir}/scripts/copy.mjs "/remote/source.txt" "/remote/dest.txt"
Create directory
node {baseDir}/scripts/mkdir.mjs "/remote/new-dir"
File info
node {baseDir}/scripts/info.mjs "/remote/file.txt"
Notes
- All FTP operations are proxied through your PHP server via HTTP.
- Upload works by sending file as base64 to the PHP proxy.
- Download retrieves base64 content from the PHP proxy and saves locally.
- Large files are supported but limited by PHP server's
upload_max_filesizeandmemory_limit. - Set
FTP_PHP_CONFIGenv var as a single-line JSON string.