MCP Server for FTP Access について
FTP、FTPS、SFTP サーバー上のファイルを管理する MCP サーバーです。リモート操作に加え、サーバー実行ホストとリモートストレージ間のストリーミング転送に対応し、認証情報の保護やローカルパスの制限を設定できます。
主な機能
- 01リモートファイルとディレクトリの一覧・管理
- 02テキストおよびバイナリファイルの転送
- 03リモートテキストファイルの編集と追記
- 04FTP、FTPS、SFTP に対応
- 05認証情報の暗号化とローカルパス制限
活用シーン
- 01ビルドしたサイトをリモートストレージへアップロード
- 02SFTP サーバーからファイルをダウンロード
- 03リモートサーバー上のテキストファイルを更新
- 04エージェントの転送先を許可フォルダーに限定
MCP 対応
ディレクトリ一覧、転送、編集、削除など、11 種のファイル管理ツールを MCP クライアントに公開します。`FTP_LOCAL_ROOTS` を設定すると、ローカルパスを使ったストリーミングツールが有効になります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
FTP、FTPS、SFTP アクセス用 MCP サーバー
この Model Context Protocol(MCP)サーバーは、FTP、FTPS、SFTP サーバー向けのファイル管理ツールを提供します。ディレクトリ一覧の表示、バイナリデータを安全に扱えるダウンロード/アップロード、テキストの編集、追記、名前変更/移動、ディレクトリの作成、削除に対応しています。
プロトコルのサポート
- FTP — 従来の FTP。通常はポート 21 を使用します。
- FTPS — TLS で保護された FTP。
FTP_PROTOCOL=ftpとFTP_SECURE=trueを使用します。 - SFTP — SSH ファイル転送プロトコル。通常はポート 22 を使用します。SFTP は FTPS とは異なるプロトコルで、SSH によってすでに暗号化されているため、
FTP_SECUREは適用されません。
機能
- ファイルとディレクトリの一覧表示
- テキストファイルまたはバイナリファイルのダウンロードとアップロード
- ローカルファイルをパスで指定してストリーミングでアップロードおよびダウンロード(オプトイン)。リクエストによるサイズ制限はありません
- リモートファイル内のテキストを正確に編集
- ファイルへの追記
- ファイル/ディレクトリの名前変更または移動
- ディレクトリの作成と削除
- FTP、FTPS、SFTP のサポート
- SFTP パスワードまたは SSH 秘密鍵による認証
- オプションの 1Password CLI 秘密鍵解決
- AES-256-GCM による認証情報の暗号化
- 暗号化キーの OS キーチェーン対応
入手先
Cursor プラグインディレクトリへの掲載は審査中です。
インストール
前提条件
- Node.js 18.14 以降
- Claude Desktop などの MCP 対応クライアント
npm でのインストール
サーバーは mcp-server-ftp として公開されています。
{
"mcpServers": {
"ftp-server": {
"command": "npx",
"args": ["-y", "mcp-server-ftp"],
"env": {
"FTP_HOST": "ftp.example.com"
}
}
}
}
Smithery でのインストール(非推奨)
Smithery は 2026 年 10 月 31 日に MCP プロキシと接続管理を終了する予定で、Smithery CLI は非推奨となっています。このインストール方法はその時点で利用できなくなります。代わりに npm からインストールしてください。
npx -y @smithery/cli install alxspikers-team/mcp-server-ftp --client claude
Cursor プラグイン
このリポジトリは Cursor プラグインでもあります。.cursor-plugin/plugin.json と mcp.json で構成され、npx -y mcp-server-ftp を ftp-server として実行します。以下の各 FTP_* 設定は、Cursor でプラグインをインストールまたは設定するときに指定するプラグイン変数です。
ソースからのビルド
git clone https://github.com/alxspiker/mcp-server-ftp.git
cd mcp-server-ftp
npm install
npm run build
設定
FTP の例
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": ["/absolute/path/to/mcp-server-ftp/build/index.js"],
"env": {
"FTP_HOST": "ftp.example.com",
"FTP_PORT": "21",
"FTP_PROTOCOL": "ftp",
"FTP_USER": "your-username",
"FTP_PASSWORD": "your-password"
}
}
}
}
FTPS の例
FTPS では、TLS を有効にした通常の FTP クライアントを使用します。
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": ["/absolute/path/to/mcp-server-ftp/build/index.js"],
"env": {
"FTP_HOST": "ftps.example.com",
"FTP_PORT": "21",
"FTP_PROTOCOL": "ftp",
"FTP_SECURE": "true",
"FTP_USER": "your-username",
"FTP_PASSWORD": "your-password"
}
}
}
}
FTP_SECURE が意味を持つのは FTP_PROTOCOL=ftp の場合のみです。SFTP は SSH で暗号化されているため、SFTP の処理では無視されます。
自己署名証明書を使用する信頼できる FTPS サーバーでは、FTPS の env オブジェクトに "FTP_TLS_REJECT_UNAUTHORIZED": "false" を追加します。これにより TLS 暗号化は維持されますが、証明書とホスト名の検証は無効になります。そのため、サーバーとネットワークを独自に信頼できる場合にのみ使用してください。既定では検証が有効です。この設定を使用するには、FTP_SECURE=true と FTP_PROTOCOL=ftp が必要です。
SFTP の例
{
"mcpServers": {
"ftp-server": {
"command": "node",
"args": ["/absolute/path/to/mcp-server-ftp/build/index.js"],
"env": {
"FTP_HOST": "sftp.example.com",
"FTP_PORT": "22",
"FTP_PROTOCOL": "sftp",
"FTP_USER": "your-username",
"FTP_PRIVATE_KEY_PATH": "~/.ssh/id_ed25519",
"FTP_PASSPHRASE": "your-key-passphrase"
}
}
}
}
設定オプション
| 環境変数 | 対象 | 説明 | デフォルト |
|---|---|---|---|
FTP_HOST | すべて | サーバーのホスト名または IP アドレス | localhost |
FTP_PORT | すべて | サーバーのポート | FTP/FTPS の場合は 21、SFTP の場合は 22 |
FTP_PROTOCOL | すべて | ftp または sftp | ftp |
FTP_USER | すべて | ユーザー名。暗号化された enc: 値に対応しています | anonymous |
FTP_PASSWORD | すべて | パスワード。暗号化された enc: 値に対応しています | 空 |
FTP_SECURE | FTP/FTPS のみ | FTP クライアントで TLS/FTPS を有効にします | false |
FTP_TLS_REJECT_UNAUTHORIZED | FTPS のみ | FTPS 証明書とホスト名を検証します。false にすると、信頼済みの自己署名証明書を許可しますが、ID 検証は無効になります | true |
FTP_PRIVATE_KEY_PATH | SFTP のみ | SSH 秘密鍵のパス、または op:// 形式の 1Password シークレット参照 | 自動検出 |
FTP_PASSPHRASE | SFTP のみ | SSH 秘密鍵のパスフレーズ。暗号化された enc: 値に対応しています | 空 |
FTP_ENCRYPTION_KEY | 暗号化された認証情報 | 64 文字の 16 進数 AES-256 鍵です。ローカルインストールでは、OS のキーチェーンまたはグローバル環境変数を使用してください。 | 無効 |
FTP_LOCAL_ROOTS | ローカルファイルツール | upload-local-file が読み取り、download-to-local が書き込みできるローカルディレクトリ。区切り文字は macOS/Linux では :、Windows では ; です。~ は展開されます。 | 無効 |
SFTP 認証
SFTP は秘密鍵認証とパスワード認証に対応しています。
サーバーは、次の順序で秘密鍵を探します。
- 設定されている場合は
FTP_PRIVATE_KEY_PATH ~/.ssh/id_ed25519~/.ssh/id_rsa~/.ssh/id_ecdsa
鍵が見つからない場合は、FTP_PASSWORD が使用されます。
1Password から SFTP 鍵を読み込む
FTP_PRIVATE_KEY_PATH には、ファイルシステムのパスの代わりに 1Password シークレット参照を指定できます。
"FTP_PRIVATE_KEY_PATH": "op://Private/my-server/private key"
要件:
- 1Password CLI(
op)がインストールされ、PATHから利用できる必要があります。 - デスクトップアプリとの統合、または
OP_SERVICE_ACCOUNT_TOKENを通じて、CLI がすでに認証済みである必要があります。
鍵は必要時に解決され、プロセスのメモリ内にキャッシュされます。ディスクには書き込まれません。
SSH サーバーが 1Password のデフォルトのエクスポート鍵形式を受け付けない場合は、OpenSSH 形式を指定してください。
"FTP_PRIVATE_KEY_PATH": "op://Private/my-server/private key?ssh-format=openssh"
認証情報の暗号化
FTP_USER、FTP_PASSWORD、FTP_PASSPHRASE は、enc: 形式を使用した AES-256-GCM 暗号化値として保存できます。
暗号化鍵を生成する
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
OS のキーチェーンに鍵を保存する(ローカルインストールに推奨)
npm run build
npm run store-key -- <your-64-char-hex-key>
利用可能な場合、サーバーは macOS Keychain、Windows Credential Manager、または Linux Secret Service から鍵を読み込みます。
または、プロセス環境に鍵をグローバルに設定します。
export FTP_ENCRYPTION_KEY=<your-64-char-hex-key>
デプロイ環境に個別のシークレット保存手段がない場合を除き、暗号化された認証情報と同じローカル MCP 設定内に FTP_ENCRYPTION_KEY を配置しないでください。
値を暗号化する
npm run build
FTP_ENCRYPTION_KEY=<your-64-char-hex-key> npm run encrypt-env -- <plaintext-value>
OS のキーチェーンまたはシェル環境から鍵をすでに利用できる場合:
npm run encrypt-env -- <plaintext-value>
利用可能なツール
| ツール | 説明 |
|---|---|
list-directory | リモートディレクトリの内容を一覧表示します |
download-file | ファイルをダウンロードします。バイナリコンテンツは base64 として返されます |
upload-file | テキストまたは base64 エンコードされたバイナリコンテンツをアップロードします |
create-directory | ディレクトリを作成します |
delete-file | ファイルを削除します |
delete-directory | ディレクトリを削除します |
rename-file | ファイルまたはディレクトリの名前を変更するか、移動します |
edit-file | リモートのテキストファイル内の完全一致するテキストを置換します |
append-file | ファイルにコンテンツを追加します。ファイルが存在しない場合は作成します |
upload-local-file | ローカルファイルをパスで指定してストリーミングアップロードし、その後リモートのサイズを確認します(FTP_LOCAL_ROOTS が必要です) |
download-to-local | リモートファイルをローカルパスにストリーミングダウンロードします。内容は返しません(FTP_LOCAL_ROOTS が必要です) |
ツール呼び出しは、機械可読な structuredContent を返します。また、11 個すべてのツールが出力スキーマを公開します。バージョン 1.2.2 では、公開されるスキーマが現在の MCP クライアントで必要な JSON Schema 2020-12 方言を使用するようにする互換性シムが導入されました。
ローカルファイルの転送
upload-file と download-file は、ツール呼び出し自体を通じてファイルの内容を渡すため、小さなテキストファイルに適しています。ビルド済みのシングルページアプリや画像など、より大きなファイルの場合、エージェントはファイル全体をリクエストに書き込む必要があり、ほとんどのクライアントでは対応できません。代わりに、upload-local-file と download-to-local は、このサーバーを実行しているコンピューター上のパスを受け取り、ファイルを直接ストリーミングするため、サイズは接続によってのみ制限されます。
使用を許可するフォルダーを指定するまで、これらの機能は無効になっています。
"env": {
"FTP_HOST": "ftp.example.com",
"FTP_USER": "your-username",
"FTP_PASSWORD": "your-password",
"FTP_LOCAL_ROOTS": "~/Sites/build:~/Downloads/uploads"
}
- 許可されたフォルダーの外にあるパスは、そのパスに関する情報を調べる前に拒否されます。そのため、そのパスや親フォルダーが存在するかどうかにかかわらず、同じ応答が返されます。
- パスはシンボリックリンクをたどった後に解決されるため、許可されたフォルダー内にあるリンクがその外を指している場合は拒否されます。アップロードでは、この確認の後に開いた単一のファイル記述子(プラットフォームで利用可能な場合は
O_NOFOLLOWを使用)を通じて読み込むため、確認と転送の間にファイルが差し替えられることはありません。 download-to-localは、ターゲットと同じ場所にランダムな名前の一時ファイルを排他的に作成し(利用可能な場合はO_NOFOLLOWとともにO_CREAT | O_EXCLを使用)、その記述子のみを通じて書き込みます。そのため、その名前でファイルやシンボリックリンクが仕掛けられていても、ダウンロード先を変更されることはありません。overwriteが false(デフォルト)の場合、ダウンロード完了後は置き換えを行わない操作(ハードリンク、またはファイルシステムがハードリンクに対応していない場合は排他的なコピー)で確定されるため、ダウンロード中にターゲットに作成されたファイルが置き換えられることはありません。overwrite: trueの場合は、ターゲットを上書きするように名前が変更されます。ターゲットに既存のシンボリックリンクがある場合は拒否され、成功時も失敗時も一時ファイルは削除されます。upload-local-fileはファイルのサイズと SHA-256 を報告し、サーバーが転送後に報告するサイズ(FTP のSIZEまたは SFTP のstat)とローカルのサイズを比較します。
オプションの HOL Guard による保護
HOL Guard には、オプトイン方式の FTP MCP プロファイル(mcp.ftp、カタログ ID command.mcp-ftp)があり、PR #4514 でマージされました。この変更を含む HOL Guard のリリースまたはソースビルドを使用してください。マージ前に公開されたリリースには含まれていません。
プロファイルを使用するには、次の手順を実行します。
- HOL Guard をインストールし、セットアップ手順に従って MCP クライアントの保護を設定します。
- npm の設定に示すように、
npx mcp-server-ftpを通じてこのサーバーを起動します。 - HOL Guard の Protection Center から、ローカルで FTP MCP を有効にします。
有効にすると、delete-directory でリモートディレクトリとその内容を再帰的に削除する前に、人による確認が必要になります。それ以外のツールと不明なツールには、既存の Guard ポリシーが適用されます。デバイス上のカスタム許可設定は追加されたデフォルト設定より優先され、より強い保護要件も引き続き有効です。
このプロファイルはデフォルトで無効です。npx を使った npm パッケージの起動に適用されます。node build/index.js による直接起動は、このプロファイルの対象外です。
セキュリティに関する注意事項
- 利用可能な場合は SFTP を優先してください。FTPS の証明書設定を行わずに、SSH の暗号化と鍵認証を利用できます。
FTP_SECURE=trueは、FTP プロトコル経由で接続する FTPS サーバーにのみ使用してください。- クライアントの設定に平文の認証情報が含まれる場合は、認証情報の暗号化を使用してください。
FTP_LOCAL_ROOTSが設定されていない場合、ローカルファイル転送は無効です。エージェントが公開元またはダウンロード先として利用してもよいフォルダーだけを指定してください。指定したフォルダー内のファイルはすべてサーバーにアップロードできます。- FTP と SFTP の転送では、アップロード、ダウンロード、追記の処理に短時間だけローカルの一時ファイルが使用されることがあります。これらのファイルは、各処理後のクリーンアップ時に削除されます。
Windows ビルドのトラブルシューティング
- Node.js 18.14 以降と npm がインストールされていることを確認します。
npm installを実行します。npm run buildまたはnpx tscを実行します。node build/index.jsでコンパイル済みのサーバーを起動します。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
