ftp-deploy-mcp
ftp-deploy-mcp
Der Deploy-Button für KI-Coding-Agenten. Claude Code · Claude Desktop · Cursor · Windsurf · Trae · Antigravity → deine eigenen FTP / FTPS / SFTP-Server.
Version française → README.fr.md
Dein Agent führt den Deploy aus — du fragst einfach.
Warum
Jedes Webprojekt endet gleich: „Jetzt noch auf den Server damit.“
KI-Agenten schreiben großartigen Code, aber die meisten haben keinen sicheren Weg, ihn auf klassisches Hosting zu bringen — OVH, Ionos, Hostinger, o2switch und der Rest der Shared-Hosting-Welt läuft immer noch über FTP/SFTP, nicht über
git push.ftp-deploy-mcpgibt jedem MCP-Client einen Deploy-Weg zu deiner eigenen Infrastruktur — im selben Gespräch, in dem der Code geschrieben wurde.Anders als generische SSH-Exec-MCP-Server ist dieser gezielt für Datei-Deployments gebaut: eine Pfad-Jail, ein Read-only-Modus, Dry-run und Zugangsdaten, die nie in den Kontext des Modells gelangen.
Related MCP server: mcp-remote-ssh
Funktionen
Funktion | Beschreibung |
Multi-Server | FTP / FTPS / SFTP, beliebig viele Server in einer Konfiguration |
Ein-Befehl-Deploy | Rekursives Verzeichnis-Deployment, gitignore-ähnliche Ausschlüsse auf jeder Ebene, Dry-run |
Pfad-Jail | Jede Operation auf ein pro Server festgelegtes |
Read-only-Modus | Blockiert jeden Schreibzugriff auf Server, die unangetastet bleiben müssen |
FileZilla-Import | Konvertiert deine vorhandenen |
Auto-Setup | Konfiguriert 5+ MCP-Clients automatisch, mit zeitgestempelten Backups |
Doctor | Read-only-Diagnose von Node, Konfiguration, Servern und Client-Verdrahtung |
Zero Build | Reines ESM-JavaScript — Node-Stdlib + 5 kleine Abhängigkeiten |
Sicherheitsstandard | Reines FTP / unverifiziertes TLS wird standardmäßig verweigert, außer pro Server explizit erlaubt |
Praxisgetestet | 209 e2e-Assertions gegen echte lokale FTP + SFTP-Server |
Keine Telemetrie | Nichts verlässt deinen Rechner außer den Aufrufen an deine eigenen Server |
Schnellstart
git clone https://github.com/alebgl77/ftp-deploy-mcp.git && cd ftp-deploy-mcpFühre
install.cmdaus (Doppelklick, Windows) oder./install.sh(macOS / Linux).Starte deine IDE neu und sag deinem Agenten: „Deploy ./dist to prod.“
So funktioniert es
flowchart LR
subgraph agents [AI agents]
A[Claude Code]; B[Cursor]; C[Windsurf]; D[Trae]; E[Antigravity]
end
agents -- MCP stdio --> S[ftp-deploy-mcp<br/>10 tools · path jail · read-only guard]
S -- FTP / FTPS --> F[(your web hosts)]
S -- SFTP --> G[(your servers)]
K[ftp-servers.json<br/>credentials stay local] -.-> S1. Was es ist
Ein MCP-Server (Model Context Protocol), der über stdio läuft und 10 Tools für
deinen Coding-Agenten bereitstellt. Zugangsdaten liegen in einer lokalen Konfigurationsdatei und gelangen nie in den Kontext des LLM.
Jede Remote-Operation ist auf ein root beschränkt, das du pro Server festlegst.
Benötigt Node.js >= 18. Keine nativen Abhängigkeiten, nichts zu kompilieren.
2. Installation
⚡ Ein-Befehl-Installation (empfohlen)
git clone https://github.com/alebgl77/ftp-deploy-mcp.git
cd ftp-deploy-mcpStarte dann den Assistenten:
Windows: Doppelklick auf
install.cmd.macOS / Linux:
./install.sh(falls nötig zuerstchmod +x install.sh).Oder manuell:
npm install && npm run setup.
Der setup-Assistent erledigt alles für dich:
erstellt oder importiert deine Serverkonfiguration (einschließlich FileZilla-Import deiner vorhandenen Sites);
testet die Verbindung zu jedem Server;
schreibt automatisch die Konfigurationsdateien der erkannten MCP-Clients (Claude Code, Claude Desktop, Cursor, Windsurf, Antigravity) — mit einem
.backup-<Datum>-Backup, bevor eine vorhandene Datei verändert wird;gibt einen einfügefertigen Block aus (und kopiert ihn) für Trae, das über seine UI konfiguriert wird.
Starte dann deine IDE neu und sag deinem Agenten z. B.: „Liste meine FTP-Server auf.“
Diagnose und Optionen
Jederzeit verfügbar: eine read-only-Diagnose (schreibt nichts):
npm run doctor # or: node src/index.js doctorSie zeigt die Node-Version, welche Konfigurationsdatei verwendet wird, die Serverliste (niemals
Passwörter) und — pro Client — ob der ftp-Eintrag mit dieser Installation verdrahtet ist.
setup-Optionen (node src/index.js setup [optionen]):
Option | Wirkung |
| Nicht-interaktiv (behält die vorhandene Konfiguration oder importiert mit |
| Zu konfigurierende Clients (Standard: alle erkannten). |
| Import aus FileZilla (Pfad optional → Standardort). |
| Ziel der Konfigurationsdatei (Standard |
| Überspringt die Verbindungstests. |
| Zeigt die geplanten Aktionen an und schreibt nichts. |
| Ersetzt einen vorhandenen, aber abweichenden |
(b) Globale Installation
npm install -g .Der Befehl ftp-deploy-mcp ist jetzt in deinem PATH; verwende ihn statt
node .../src/index.js.
(c) Auf npm veröffentlichen (für npx -y-Nutzung)
Wenn du dieses Paket unter deinem eigenen Namen auf npm veröffentlichst, können Clients es ohne vorherige Installation ausführen:
{ "command": "npx", "args": ["-y", "your-package-name"] }3. Serverkonfiguration
Erstelle eine Datei ftp-servers.json. Der Server sucht sie in dieser Reihenfolge (die erste
gefundene gewinnt):
--config <pfad>(Kommandozeilen-Flag)Umgebungsvariable
FTP_MCP_CONFIG(Pfad zur JSON-Datei)./ftp-servers.json(aktuelles Arbeitsverzeichnis)~/.ftp-mcp/servers.json
Vollständiges Schema
{
"defaultServer": "prod", // optional: used when "server" is not given
"servers": {
"prod": {
"protocol": "sftp", // REQUIRED: "ftp" | "ftps" | "sftp"
"host": "ssh.example.com", // REQUIRED
"port": 22, // optional (defaults: ftp/ftps 21, implicit ftps 990, sftp 22)
"user": "deploy", // REQUIRED
"password": "${ENV:PROD_PW}", // optional: password (or an env placeholder)
"privateKeyPath": "~/.ssh/id_ed25519", // optional (sftp); "~" is expanded
"passphrase": "…", // optional: private-key passphrase
"root": "/var/www/site", // optional (default "/"): ALL ops are jailed under it
"readOnly": false, // optional: blocks upload/deploy/mkdir/rename/delete
"insecureTLS": false, // optional (ftps): skip certificate checks — requires "allowInsecure"
"implicitTLS": false, // optional (ftps): implicit TLS (port 990, legacy servers)
"allowInsecure": false // optional: explicit opt-in REQUIRED for plain "ftp" or "insecureTLS"
}
}
}Der Block oben verwendet
//-Kommentare nur zur Veranschaulichung. Die echte Datei muss strenges JSON sein (keine Kommentare). Sieheftp-servers.example.json.
Ersetzung durch Umgebungsvariablen
Jeder String-Wert darf ${ENV:VARIABLE_NAME} enthalten. Er wird beim Start durch den Wert der
Umgebungsvariable ersetzt. Ist die Variable nicht gesetzt, geben die Tools eine klare Fehlermeldung
mit dem Namen der fehlenden Variable aus.
"password": "${ENV:OVH_FTP_PASSWORD}"Sicherheitstipps
Bevorzuge SFTP. Reines
ftpundftpsmitinsecureTLS: truewerden standardmäßig abgelehnt: Bei diesen Transporten kann ein Netzwerkangreifer Zugangsdaten und Dateien abfangen oder verändern. Um sie trotzdem zu verwenden, musst du auf dem jeweiligen Server explizit"allowInsecure": truesetzen — und jeder Start-Log sowie jedes Tool-Ergebnis trägt dann eine sichtbare Sicherheitswarnung.Nimm
ftp-servers.jsonin deine.gitignoreauf (in diesem Repo bereits erledigt).Beschränke die Dateirechte (
chmod 600 ftp-servers.jsonunter Unix).Bevorzuge Umgebungsvariablen (
${ENV:…}) oder einen SSH-Schlüssel gegenüber einem Klartextpasswort.Verwende
readOnly: truefür Server, auf die der Agent niemals schreiben darf.Setze
rootso eng wie möglich: Die Jail verhindert jeden../-Ausbruch.
4. Import aus FileZilla
Hast du deine Sites bereits in FileZilla? Konvertiere sie:
# Auto-detect the default sitemanager.xml location…
node src/index.js import-filezilla
# …or an explicit file, written to an ftp-servers.json
node src/index.js import-filezilla --file /path/sitemanager.xml --out ./ftp-servers.jsonOhne --out wird das JSON auf stdout ausgegeben. Base64-kodierte Passwörter werden dekodiert; Sites
ohne gespeichertes Passwort erhalten einen ${ENV:<NAME>_PASSWORD}-Platzhalter (die Variable setzt du
selbst). Beispielausgabe:
{
"defaultServer": "my-site",
"servers": {
"my-site": {
"protocol": "ftp",
"host": "ftp.example.com",
"user": "deploy",
"password": "…",
"root": "/www/html"
}
}
}Achtung: Die erzeugte Datei enthält dekodierte Klartextpasswörter — halte sie aus der Versionskontrolle heraus (
.gitignore) und beschränke ihre Rechte (chmod 600).
Reine-FTP-Sites: Importierte Server mit
"protocol": "ftp"(wie im Beispiel oben) werden beim Verbindungsaufbau abgelehnt, bis du sie entweder aufsftp/ftpsumstellst oder explizit"allowInsecure": truebei ihnen setzt — der Import gibt für jede solche Site eine Warnung aus. Siehe Sicherheit.
5. Manuelle Client-Einrichtung (falls du setup nicht verwendest)
npm run setupschreibt diese Dateien automatisch (mit Backups). Dieser Abschnitt ist nur nützlich, wenn du lieber alles von Hand verdrahtest.
Ersetze /absolute/path/to/ftp-deploy-mcp/src/index.js durch den echten Pfad (Schrägstriche
/ funktionieren auch unter Windows). Wenn du das Paket auf npm veröffentlicht hast, ersetze
"command": "node", "args": ["…/src/index.js"] durch
"command": "npx", "args": ["-y", "dein-paketname"].
Die unten angegebenen Dateipfade sind die Standardpfade zum Zeitpunkt der Erstellung dieser Dokumentation; die UIs dieser Produkte entwickeln sich weiter, also prüfe bei Bedarf deren Doku.
Claude Code
.mcp.json im Projektstamm:
{
"mcpServers": {
"ftp": {
"command": "node",
"args": ["/absolute/path/to/ftp-deploy-mcp/src/index.js"]
}
}
}Oder in einem Befehl:
claude mcp add ftp -- node /absolute/path/to/ftp-deploy-mcp/src/index.jsClaude Desktop
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"ftp": {
"command": "node",
"args": ["/absolute/path/to/ftp-deploy-mcp/src/index.js"]
}
}
}Cursor
~/.cursor/mcp.json (global) oder .cursor/mcp.json (Projekt):
{
"mcpServers": {
"ftp": {
"command": "node",
"args": ["/absolute/path/to/ftp-deploy-mcp/src/index.js"]
}
}
}Windsurf
~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"ftp": {
"command": "node",
"args": ["/absolute/path/to/ftp-deploy-mcp/src/index.js"]
}
}
}Trae
Trae hat keine stabile Konfigurationsdatei — alles läuft über die UI. KI-Chat-Panel →
Einstellungen/Zahnrad → MCP → Hinzufügen → Manuell konfigurieren, dann einfügen (das ist der Block,
den setup ausgibt und in deine Zwischenablage kopiert):
{
"mcpServers": {
"ftp": {
"command": "node",
"args": ["/absolute/path/to/ftp-deploy-mcp/src/index.js"]
}
}
}Antigravity
Je nach Version ist die Datei eine der folgenden:
~/.gemini/antigravity/mcp_config.jsonVariante:
~/.gemini/config/mcp_config.json
{
"mcpServers": {
"ftp": {
"command": "node",
"args": ["/absolute/path/to/ftp-deploy-mcp/src/index.js"]
}
}
}Du kannst auch das MCP-Panel des Agenten (MCP-Serververwaltung) → Server hinzufügen verwenden, mit derselben Struktur.
6. Die 10 Tools
Alle Remote-Pfade (path, remote_path, …) sind relativ zum Server-root und verwenden
POSIX-Stil. Der Parameter server ist immer optional (siehe Auflösung unten).
Tool | Parameter | Beschreibung |
| (keine) | Konfigurierte Server auflisten (Protokoll, Host, Port, Root, Nur-Lesen, Auth-Art). Niemals ein Passwort. |
|
| Verbinden, Root auflisten, Erfolg bestätigen. |
|
| Ein entferntes Verzeichnis auflisten (Verzeichnisse zuerst). |
|
| Eine Textdatei lesen (Standard 262144, max. 1048576 Bytes). Verweigert Binärdateien. |
|
| Eine Datei hochladen und übergeordnete Verzeichnisse erstellen. |
|
| Ein Verzeichnis rekursiv über eine einzige Verbindung bereitstellen, mit Standard-Ausschlüssen. |
|
| Eine Datei herunterladen; verweigert das Überschreiben, außer bei |
|
| Ein Verzeichnis erstellen (rekursiv). |
|
| Umbenennen oder verschieben. |
|
| Eine Datei löschen; ein Verzeichnis erfordert |
Serverauflösung: expliziter server-Parameter → defaultServer → der einzige Server, falls
es nur einen gibt → andernfalls ein Fehler, der die verfügbaren Namen auflistet.
Standard-Ausschlüsse für ftp_deploy: **/node_modules/**, **/.git/**, .env, .env.*,
*.log, .DS_Store, Thumbs.db, ftp-servers.json, **/.ftp-mcp/** (deine exclude-Globs
werden hinzugefügt; include schränkt auf passende Dateien ein). Muster ohne Schrägstrich
treffen auf jeder Tiefe zu (gitignore-artig): auch ein verschachteltes apps/api/.env wird
ausgeschlossen.
7. Beispiel-Prompts
„
./distauf demprod-Server bereitstellen."„Auflisten, was in
/wwwaufovhliegt."„Die
.htaccessvonprodholen und mir zeigen."„Einen Probelauf der Bereitstellung von
./buildnach/wwwmachen, damit ich sehen kann, was gesendet würde."„
index.old.htmlaufprodinindex.htmlumbenennen."
8. Sicherheit
Standardmäßig sichere Übertragung: einfaches FTP und FTPS mit deaktivierter Zertifikatsprüfung (
insecureTLS: true) werden verweigert, sofern der Servereintrag nicht explizit"allowInsecure": truesetzt. Wenn erlaubt, wird beim Start, inftp_list_servers, indoctorund an jedes Tool-Ergebnis für diesen Server eine Sicherheitswarnung angehängt.Root-Gefängnis: jede Operation wird normalisiert und dann verifiziert, dass sie unterhalb des Server-
rootbleibt. Jeder Ausbruchsversuch (../…) wird verweigert, selbst wennroot/ist.Nur-Lesen:
readOnly: trueblockiert jeden Schreibzugriff (Upload, Deploy, mkdir, rename, delete); Lesezugriffe funktionieren weiterhin.Zugangsdaten außerhalb der LLM: Passwörter, Passphrasen und Schlüssel werden niemals in der Tool-Ausgabe zurückgegeben.
Keine Telemetrie, keine ausgehenden Verbindungen außer zu deinen eigenen Servern.
Verbindungen pro Aufruf: jedes Tool öffnet eine Verbindung, führt die Operation aus und schließt sie — keine dauerhafte Sitzung.
9. Fehlerbehebung
Timeout / keine Verbindung (FTP): meist ist der Passivmodus durch eine Firewall blockiert. Stelle sicher, dass die Passiv-Ports deines Servers erreichbar sind.
SFTP-Schlüssel-Authentifizierung: setze
privateKeyPath(~wird expandiert) und, falls der Schlüssel verschlüsselt ist,passphrase. Prüfe die Berechtigungen des Schlüssels.„INSECURE CONNECTION REFUSED": Der Server verwendet einfaches FTP oder FTPS mit deaktivierter Zertifikatsprüfung. Stelle auf
sftp(oderftpsmit einem gültigen Zertifikat) um — oder, nur wenn du das Abhörrisiko vollständig akzeptierst — setze"allowInsecure": trueauf diesem Server.Selbstsigniertes FTPS:
insecureTLS: trueakzeptiert ein unverifiziertes Zertifikat. Dies deaktiviert den Schutz vor Man-in-the-Middle-Angriffen, erfordert daher ebenfalls"allowInsecure": trueund gibt bei jedem Aufruf eine Sicherheitswarnung aus. Bevorzuge die Installation eines gültigen Zertifikats.Implizites FTPS (Port 990): setze
implicitTLS: true(ftps-Protokoll) für ältere Server, die ab dem ersten Byte verschlüsseln, ohne einenAUTH TLS-Befehl.„no server configured": Die Datei wurde an keiner der 4 Speicherorte gefunden. Erstelle
ftp-servers.jsonoder übergib--config <path>/FTP_MCP_CONFIG=<path>.Der Client sieht die Tools nach
setupnicht: starte die IDE vollständig neu (schließe jedes Fenster, nicht nur das Projekt) und überprüfe dann die Verkabelung mitnpm run doctor.Der Server startet trotz ungültiger Konfiguration: das ist beabsichtigt (MCP-Clients mögen keine Server, die beim Start sterben). Der genaue Fehler wird beim Start auf
stderrausgegeben und bei jedem Tool-Aufruf zurückgegeben.
Entwicklung
npm test # runs the full smoke test (local FTP + SFTP, no external network)
node src/index.js --version
node src/index.js --helpMitwirken
Beiträge sind willkommen — siehe CONTRIBUTING.md für das Entwicklungs-Setup, die Prinzipien des Projekts und die PR-Checkliste.
Sicherheit
Eine Schwachstelle gefunden? Bitte kein öffentliches Issue eröffnen — siehe SECURITY.md für die Meldung auf privatem Weg.
Lizenz
MIT — siehe LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn enterprise-grade MCP server for FTP and SFTP operations optimized for AI coding assistants, featuring smart synchronization, connection pooling, and unified diff patching.28342MIT
- AlicenseAqualityAmaintenanceMCP server giving AI agents full SSH access with persistent sessions, structured command output, SFTP file transfer, and port forwarding.188MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives AI agents SSH capabilities to execute commands, transfer files, and inspect remote systems through a preconfigured host list.43MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that enables AI assistants to perform development operations on remote servers via SSH, including executing commands, managing files, and browsing directories.1MIT
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Hosted MCP for creating, checking, deploying, and hosting static sites for AI agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/alebgl77/ftp-deploy-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server