Repository navigation
Releases: alebgl77/ftp-deploy-mcp
Releases · alebgl77/ftp-deploy-mcp
Release list
v0.3.2 — Publication verification hardening
Full Changelog: v0.3.1...v0.3.2
v0.3.1 — Reproducible release qualification
Full Changelog: v0.3.0...v0.3.1
v0.3.0 — Durable, secure deployments
v0.2.0 — Verified staged transfers, local confinement and a bilingual EN/FR interface
The GitHub tag and release are cut from this commit. Publication to npm and to
the MCP registry is still pending, so npx -y ftp-deploy-mcp and registry-based
installation do not work yet; install from source. Package and server metadata
are aligned at 0.2.0. All changes below are relative to 0.1.0, the only version
ever released.
Added
- Bilingual command line.
--lang enand--lang fr(also--lang=fr) select
the language of general and subcommand help,setupprompts and choices,
connection-test labels,doctordiagnostics,import-filezillawarnings and
server startup messages. The newFTP_MCP_LANGenvironment variable sets the
same default, and the option takes precedence over it, including over an
invalid environment value. The option is read before the subcommand parser and
may appear before or after the subcommand. Onlyenandfrare accepted; an
invalid or incomplete option exits unsuccessfully beforesetupor
import-filezillawrites anything. OS locale variables such asLANGare
never consulted. See languages. - Localized MCP contracts. Tool titles, descriptions, input field descriptions,
business success text and error messages follow the selected language. The ten
tool names, structured result field names and public error codes are stable and
are not translated, and no tool argument selects a language. setupwritesFTP_MCP_LANGinto the MCP client entries it generates,
includingen, so a configured server keeps its setup language after a
restart. The paste-ready Trae snippet carries the same setting.- Structured error envelope on every tool error. Alongside the
isErrortext,
results now carrystructuredContent.errorwithschema_version,code,
message,retryable, a per-callrequest_idUUID,next_actionand
effects. Upload, download and deployment errors can add a strictpartial
block (completed_files,completed_bytes,failed_files, optional
total_files, andfinal).request_idis not a durable operation
identifier; there is no journal, rollback or recovery command. This release
returnsretryable: falsefor every error and never retries an uncertain
mutation. See the error contract. - Six per-server configuration keys, each with an enforced default and maximum.
Tool arguments cannot override them, and values must be positive safe integers:
operationTimeoutMs(default 120000 ms, accepted range 100–3600000),
maxTransferBytes(default 268435456, maximum 1099511627776),
maxDeployFiles(default 10000, maximum 100000),
maxDeployBytes(default 1073741824, maximum 1099511627776),
maxScanEntries(default 100000, maximum 1000000) and
maxScanDepth(default 64, maximum 256). These defaults apply to servers that
do not set them, so a deployment that succeeded on 0.1.0 can now be refused
withTRANSFER_LIMITorSCAN_LIMITbefore any connection is opened.
BREAKING —operationTimeoutMsalso introduces a deadline 0.1.0 never
had: every tool call now aborts withTIMEOUTafter 120000 ms by default,
and unlike the other limits it fires mid-flight rather than refusing up
front, so a large or slowftp_deploythat ran to completion on 0.1.0 can
stop part-way with files already promoted and no rollback. Raise
operationTimeoutMs(up to 3600000) for slow links. See
verified transfers and
resource limits. - Process-wide admission control. One Node isolate admits at most 64 concurrent
tool calls; the 65th returns the newCAPACITY_LIMITwitheffects:none,
retryable:falseandnext_action:retry. This is a concurrency cap, not a
lifetime quota: a slot is released when its worker and cleanup actually settle,
including after cancellation or timeout, and there is no queue or automatic
retry. Admission happens after schema validation and before preparation. - MCP cancellation and per-call deadlines. A peer
notifications/cancelled
aborts the operation and the SDK suppresses its result, so clients must not
expect a deliveredCANCELLEDenvelope; the separate internal deadline
returnsTIMEOUT. Cancellation and expiry stop later stages and close the
transport, but do not undo effects already accepted by the server. A public
transport decorator corrects the installed SDK's cancellation gap for the
numeric correlation ID0and the empty string""; other IDs, including the
string"0", keep native SDK behaviour. - Serialized mutations. Writing tools take a FIFO lock on the remote endpoint
(protocol, host, port, user) andftp_downloadtakes one on the canonical
local destination, so two calls cannot interleave writes on the same target.
Locks are held until the underlying worker actually settles, not until the
response is sent, and they coordinate only within one Node.js process. - Per-server
localRootboundary forftp_upload,ftp_deploy, and
ftp_download. The root must be absolute (with~expansion supported);
traversal and local symlink/junction escapes are refused. - SFTP host-key pinning through
hostKeySha256, accepting one SHA-256
fingerprint or a non-empty array for controlled key rotation. - Explicit
allowUnknownHostKeyoverride for operators who temporarily accept
an unverified SFTP server identity. - Explicit
allowUnsafeRemoteRootoverride for FTP/FTPS operators who accept
the unresolved symlink risk of a client-side sub-root. - MCP output schemas and successful structured responses for every tool except
the intentionally text-onlyftp_read, plus annotations for all ten tools. - Bilingual documentation set, each page in English and French:
security model,
release process,
error contract,
languages,
verified transfers,
resource limits,
state storage,
workflow model and
scripted MCP conformance.CONTRIBUTING,
SECURITY,LICENSEand this changelog gain French counterparts, joining the
READMEpair that already shipped in 0.1.0; bothREADMElanguages were
rewritten for this release. - A bilingual interactive HTML guide under
site/, generated from
site/project-data.jsonandsite/i18n.jsonand verified in CI by
scripts/build-guide.mjs --check. It lives in the repository only and is
excluded from the npm package. - A reproducible, external read-only agent evaluation fixture and 10-question
MCP evaluation set, now in English (evaluations/read-only.xml) and French
(evaluations/read-only.fr.xml), plus a separate scripted conformance runner
of 43 scenarios executed in both languages against the real MCP SDK client and
in-memory transport (npm run eval:scripted). The runner is repository
tooling, is not an LLM benchmark, and is excluded from the npm package. See
scripted MCP conformance. - Internal, inert libraries
src/state/andsrc/workflow/. They ship inside
the package because it publishessrc, but they expose no MCP tool, read no
configuration, create no state directory and are not imported by the running
server. They deliver no deployment workflow, rollback or recovery in this
release; both state storage and the
workflow model state this explicitly. - Contributor-facing npm scripts:
test:transports,test:contract,
test:bounds,test:state,test:workflow,test:eval-runnerand
eval:scripted. CI additionally runsscripts/check-docs.mjsfor bilingual
documentation andtest/release-gates.js. server.jsonMCP registry metadata, declaring theFTP_MCP_CONFIGand
FTP_MCP_LANGenvironment variables and a stdio transport.- A repository
Dockerfileand.dockerignorebuilding anode:24-alpine
image whose entrypoint is the stdio server; mount a configuration file and
pointFTP_MCP_CONFIGat it. No image is published, and neither file is
included in the npm package.
Changed
- BREAKING — Node.js 18, 19, 20 and 21 are no longer supported.
engines.nodemoves from>=18to>=22. CI qualifies Node 22 and 24 on
Linux, Windows and macOS. - BREAKING — an explicit configuration selector now fails closed. When
--config <path>orFTP_MCP_CONFIGis present, that single path is
authoritative: it must exist, be a regular file and load successfully, and no
other candidate is attempted.--configtakes priority over
FTP_MCP_CONFIG, and an empty explicit value is rejected. Only when neither
is set does discovery still try./ftp-servers.jsonthen
~/.ftp-mcp/servers.json. In 0.1.0 both selectors were merely the first
entries of a fallback list, so a missing or unreadable explicit path silently
fell through to another file. The server still starts; every tool that needs
the configuration now fails withCONFIG_INVALIDinstead of operating on an
unintended configuration, andftp_list_serversreturnsstatus: "invalid"
with the loader diagnostic. - One rejected server entry no longer disables the whole configuration. Entries
are validated individually: valid servers stay usable, and each invalid one is
reported by name with its reason throughftp_list_servers(status,
valid_count,invalid_countand a boundederrorslist). Naming a rejected
entry returns that entry'sCONFIG_INVALID, an unknown name
returnsSERVER_UNKNOWN, and omittingserverwith several valid candidates
and nodefaultServerreturnsSERVER_REQUIRED. In 0.1.0 the first invalid
entry made the entire file unusable and every tool call failed. Envelope
problems — noserversobject, an empty one, an unknown `defaultSer...
v0.1.0 - The deploy button for AI coding agents
First public release.
ftp-deploy-mcp connects AI coding agents (Claude Code, Claude Desktop, Cursor, Windsurf, Trae, Antigravity) to your own FTP / FTPS / SFTP servers through the Model Context Protocol.
Highlights
- 10 MCP tools - list, read, upload, download, mkdir, rename, delete, test, list_servers, and a recursive
ftp_deploywith dry-run - Multi-server config (
ftp-servers.json) with${ENV:...}secret substitution and SSH key auth - Security model: per-server path jail (no
../escape, root undeletable), per-server read-only mode, credentials never enter the model context, gitignore-like excludes at any depth (.env,node_modules,.git,*.log) - FileZilla import - convert
sitemanager.xmlin one command (incl. implicit FTPS and RemoteDir decoding) - One-command setup -
install.cmd/install.shruns a wizard that imports your sites, tests connections, and auto-writes the MCP config of every detected client (with timestamped backups) doctorread-only diagnostic- 189 e2e assertions against real local FTP + SFTP servers, green on Linux / Windows / macOS x Node 18 / 20 / 22
Install
git clone https://github.com/alebgl77/ftp-deploy-mcp.git
cd ftp-deploy-mcp
# Windows: double-click install.cmd - macOS/Linux:
./install.sh