NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #1544 most downloaded on npm
FTP client for Node.js, supports FTPS over TLS, IPv6, Async/Await, and Typescript.
Last release 21 days ago
27 Aug 2026
Release timing varies
gaps range from 3 weeks to 1.8 years
Nearly every release is documented
notes for 10 of 10 stable releases
114 versions withdrawn
withdrawn after publishing
9 years old
124 releases · first in 2017
Fixed: Use prepublishOnly to build.
Fixed: Republish version to (maybe) fix NPM issue.
One column per quarter.
Changed: Source is now written in Typescript, builds to Javascript with declaration files for npm package. Fixes #49.
Fixed: Switch seamlessly between control and data connection for tracking timeout.
Added: Full type-checking as part of CI with Typescript and JSDoc type declarations. Check is rigourous, settings include 'strict' and 'noImplicitAny'
This release contains breaking changes:
This release contains breaking changes:
Client is now single-use only. It can't be used anymore once it closes and a new client has to be instantiated.Error, not custom error objects. Introduced FTPError for errors specific to FTP. (#37)Non-breaking changes:
await or .then() for tasks. (#36)Special thanks to @broofa for feedback and reviews.
Fixed: Multibyte UTF-8 arriving in multiple chunks
Added: Get last modification time of a file. (#32, @AnsonYeung)
Fixed: Closing client during task will reject associated promise.
Changed: Include hidden files in file listings, fixes removeDir and clearWorkingDir. Changes behaviour for downloadDir and list. (#29, @conlanpatrek)
removeDir and clearWorkingDir. Changes behaviour for downloadDir and list. (#29, @conlanpatrek)Changed: Timeout on control socket is only considered during active task, not when idle. This also fixes #27, as well as #26.
Fixed: Regression where closed clients throws timeout because of idle socket.
Fixed: Minor fixes to documentation.
Make it possible to reconnect after closing the client.
Fixed: Make it possible to reconnect after closing the FTP context.
Improved error handling and reporting.
Various improvements to documentation.
Fixed: Exception thrown if tasks will run in parallel because the user forget to use 'await'.
Added: Use client.rename() to rename or move a file.
- Minor changes to documentation
Fixed: Don't deny EPSV over IPv4. This can help in some circumstances with a NAT.
Fixed: Don't prefer IPv6 by default.
Added: Support IPv6 for passive mode (EPSV).
Added: Convenience method client.access to simplify access to an FTP(S) server.
client.access to simplify access to an FTP(S) server.client.access to simplify access to an FTP(S) server.Resolve simple NAT issues with PASV.
Improved documentation of client methods.
Mention regression in Node.js negatively affecting upload progress reporting.
Added: Report transfer progress with client.trackProgress().
- Improve introduction. - More unit tests.
When downloading, handle incoming data before announcement from control socket arrives.
- Improve documentation. - Update linter.
Change uploadDir() so that it reuses directories on the FTP server if they already exist.
- Fix linter complaint.
Fix listing parser autodetection by filtering out empty lines.
Fix TLS upgrade for data connections.
Handle TLS upgrade error by reporting it to the current task handler.
Add method to retrieve file size.
Don't report unexpected positive completion codes as errors.
Mention DOS-style directory listing support in README.
Add support for DOS-style directory listing.
Fix documentation of default arguments for login().
- Improve introduction in README
Add default port for connect().
Accept more positive preliminary and completion replies for transfers.
More internal functions made available for custom extensions.
Wait for both data and control connection reporting completion for list, upload and download.
Add features() method to client that returns a parsed result of the FEAT command.
Handle case when downloading, a server might report transfer complete when it isn't.
Encoding can be set explicitly, defaults to UTF-8.
Get user access to some internal utility functions useful in custom contexts.
Complete redesign: Better separation between a simple object-oriented client, clear customization points and access to internals. Better discovery of
Add functions to upload, download and remove whole directories.
Differentiate between Basic API and Convenience API in documentation.
Add convenience functions to request and change the current working directory.
Listeners using once wherever possible.
once wherever possible.- Fix result for send command.
- Improve documentation.
- Close sockets on timeout.
Close data socket explicitly after upload is done.
List: Some servers send confirmation on control socket before the data arrived.
Your coding agent can read these notes before it upgrades. Set up the MCP server →