mcpField
F
ftp-deploy-mcp

ftp-deploy-mcp

ローカル
github.com/alebgl77クラウド・インフラ01 週間前に更新

ftp-deploy-mcp について

ftp-deploy-mcpは、コーディングエージェントなどのMCPクライアントに、FTP、FTPS、SFTPでのファイル操作とデプロイを提供します。ローカルパス制限、読み取り専用モード、ドライランに対応し、永続ワークフローも任意で利用できます。

主な機能

  1. 01ファイルの一覧・読み取り・転送
  2. 02ドライラン付きの再帰デプロイ
  3. 03FTP、FTPS、SFTPに対応
  4. 04ローカルファイルのアクセス範囲を制限
  5. 05読み取り専用モードと任意の永続ワークフロー

活用シーン

  1. 01ローカルディレクトリからビルド成果物をデプロイ
  2. 02リモートサーバー上のファイルを確認
  3. 03デプロイ前にファイル変更をプレビュー

MCP 対応

MCPサーバーはサーバー検出、ファイル管理、デプロイのツールを公開し、stateDirの設定時には永続ワークフロー用ツールも追加します。stdioでMCPクライアントと通信し、旧クライアント向けのネゴシエーション経路も備えています。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"alebgl77-ftp-deploy": {
"command": "npx",
"args": [
"-y",
"ftp-deploy-mcp"
],
"env": {
"FTP_MCP_CONFIG": "<FTP_MCP_CONFIG>",
"FTP_MCP_LANG": "<FTP_MCP_LANG>"
}
}
}
}
起動コマンドnpx -y ftp-deploy-mcp
設定が必要な環境変数
FTP_MCP_CONFIGExplicit config path; missing or invalid paths fail closed. / Chemin explicite de configuration ; tout chemin absent ou invalide est refusé.
FTP_MCP_LANGHuman text language: en (default) or fr. / Langue du texte : en (défaut) ou fr.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmftp-deploy-mcp0.3.2

ツール

10

掲載時のツール一覧 · 2 週間前に更新

このツールにパラメーターはありません。

詳細

ftp-deploy-mcp ロゴ

ftp-deploy-mcp

AI コーディングエージェントのためのデプロイボタンです。

Claude Code、Claude Desktop、Cursor、Windsurf、Trae、Antigravity、またはあらゆる MCP クライアントから、自分の FTP、FTPS、SFTP サーバー上のファイルを一覧表示、読み取り、アップロード、ダウンロード、デプロイするための 専用の方法を利用できます。

stdio サーバーは、安定版のモジュール式 TypeScript SDK v2 を通じて MCP リビジョン 2026-07-28 を実装し、 古い MCP クライアント向けに SDK の従来のネゴシエーション経路も維持しています。

フランス語版 → README.fr.md

CLI と MCP の言語はデフォルトで英語です。--lang fr または FTP_MCP_LANG=fr を使用してください。 言語の適用範囲と優先順位。

CI License: MIT Node >=22 MCP compatible

ftp-deploy-mcp — AI エージェントのための制御されたデプロイ。MCP stdio 経由の FTP、FTPS、SFTP

専用のデプロイ制御により、認証情報がツールの応答に含まれないようにし、読み取り専用サーバーとドライランをサポートするとともに、 localRoot によってローカルファイルへのアクセスを制限します。このリポジトリには、ローカル FTP サーバーと SFTP サーバーに対して実行する 包括的なエンドツーエンドテストが含まれています。テレメトリーはありません。

提供状況: バージョン 0.3.2 は npm と 公式 MCP レジストリで公開されています。 このバージョンを利用するには、npx -y [email protected] を使用してください。 GitHub リリース は別個のソース配布物であり、main にはそれ以降の変更が含まれる場合があります。 レジストリでの公開は利用可能であることを示すものであり、依存関係が固定されていることや、別のコミットが適格であることを保証するものではありません。 リリースガイドを参照してください。

デプロイモード: 10 個の基本ツールで、制御された転送とドライランを実行できます。 stateDir を有効にすると、MCP による確認、明示的な再開、確認済みの変更に対する保守的なロールバックを備えた、永続性のある 4 個のツールが追加されます。 これらの保証はオプションの永続ワークフローに適用されます。従来の ftp_deploy にはトランザクションもロールバックもありません。

ドキュメント

ドキュメント英語フランス語
概要とインストールREADMEREADME
変更履歴変更履歴変更内容
コントリビューションガイドガイド
セキュリティポリシーポリシーポリシー
セキュリティモデルモデルモデル
リリースプロセスガイドガイド
エージェント評価手順手順
エージェントのパフォーマンスとクライアント統合ガイドガイド
スクリプトによるMCP適合性評価ガイドガイド
CLIと言語設定ガイドガイド
MCPエラー仕様仕様仕様
検証済みの段階的転送ガイドガイド
スキャンと受け入れの上限上限上限
永続状態ストレージライブラリライブラリ
永続ワークフローモデルモデルモデル
MITライセンス正式な原文参考訳

アーキテクチャとシナリオ

アーキテクチャの概要:MCPクライアントは、ftp-deploy-mcpを介して、ローカルに制限されたFTP、FTPS、SFTP転送をルーティングします。

現在および目標とするアーキテクチャ図と例示的なシナリオは、 バイリンガルのインタラクティブHTMLガイドでご覧いただけます。 ガイドと、その 英語 / フランス語 版のビルド手順は、npmパッケージの外部にあるリポジトリに含まれています。クローンした後、 site/index.htmlをローカルで開き、言語セレクターを使用してください。

検証済みデプロイのアニメーションフロー
検証済みデプロイのアニメーションフロー:スキャン、計画、承認、転送、検証、昇格を、ロールバックによる安全策とともに実施します。

動きの少ない表示をご希望の場合は、完了状態の静止画像をご覧ください。 ビジュアルシステムの由来と生成に関する注記もご覧ください。

ビジュアルの方向性はChatGPT Imageを使って検討し、READMEの最終アセットは決定論的にレンダリングしています。 その 由来と正確なプロンプト には、アセットが例示を目的とすることが記載されています。認証を示すものではありません。

初回のソースインストール

  1. サポート対象の Node.js バージョン(22、24、または26。最小バージョン:22)をインストールします。
  2. git clone https://github.com/alebgl77/ftp-deploy-mcp.git を実行し、続けて cd ftp-deploy-mcp を実行します。
  3. npm ci --omit=dev --ignore-scripts を実行します。
  4. npm run setup を実行し、生成されたサーバー設定を編集します。絶対パスの localRoot を設定し、認証情報を置き換え、以下で説明する SFTP のホスト鍵ピン、 または FTP/FTPS の安全性に関する確認項目を設定します。
  5. MCP クライアントを再起動し、ドライランを試します。
Call ftp_deploy with:
{"server":"prod","local_dir":"dist","remote_dir":"/","dry_run":true}

Windows ユーザーは手順3~4の代わりに install.cmd を、macOS/Linux ユーザーは ./install.sh を実行できます。初回接続の前に、生成されたすべてのサーバーエントリーを 確認してください。

タグ付きバージョンを使用する場合は、インストール前にそのタグをチェックアウトします。npm ci は 唯一の正式な package-lock.json を使用します。このファイルには、正確に指定された6つの直接依存関係と、 レビュー済みの依存関係グラフが含まれています。ソースと一緒に保管してください。--ignore-scripts は 依存関係のライフサイクルスクリプトの自動実行を無効にします。セットアップは別途、明示的に実行します。

公開後、v0.3.2 のソースインストール用アセットの名前は ftp-deploy-mcp-0.3.2-source.tar.gz です。ロックファイルを含む90個のファイルが含まれています。 新しいディレクトリに展開する前に、公開状況とチェックサムを確認してください。

tar --ignore-zeros -xzf ftp-deploy-mcp-0.3.2-source.tar.gz
cd package
npm ci --omit=dev --ignore-scripts
node src/index.js setup

このインストールアーカイブには、リポジトリのテストとメンテナースクリプトは含まれません。 GitHub が自動生成するソース ZIP/tar には、リポジトリ全体が含まれます。別個の npm .tgz には ロックファイルなしで89個のファイルが含まれ、npm の依存関係解決に従います。ロックされた インストールは保証されません。検証方法と制限については、 リリースガイドを参照してください。

プロトコルとセキュリティの一覧

プロトコル通信のセキュリティリモートルートの動作推奨される用途
SFTP暗号化されます。allowUnknownHostKey: true を明示的に設定してなりすましのリスクを許容しない限り、hostKeySha256 が必須です。realpath/lstat によるチェックでシンボリックリンクの構成要素を拒否し、操作が root の配下に収まるようにします。ただし、悪意のあるサーバーや状態が変化するサーバーでは、検証から使用までの間に競合状態が発生する可能性があります。推奨されます。別経路で検証したフィンガープリントをピン留めしてください。
FTPS証明書の検証に成功した場合は暗号化されます。insecureTLS: true を設定するには allowInsecure: true も必要であり、中間者攻撃への保護が無効になります。クライアント側のサブルートを、シンボリックリンクを確実に防ぐ隔離領域にすることはできません。allowUnsafeRemoteRoot: true を設定しない限り、/ 以外の root は拒否されます。表示されるルートが / となる、サーバー側で chroot された専用アカウントを使用してください。
FTP平文です。傍受と認証情報の漏えいを許容する allowInsecure: true が設定されていない限り、拒否されます。FTPS と同じ制限があります。実際の境界となるのはサーバーアカウント/chroot であり、クライアント側の字句的なパスチェックではありません。信頼できるネットワーク上で、専用の chroot アカウントを使用するレガシー環境に限ります。

3つのプロトコルすべてで、ftp_upload、ftp_deploy、 ftp_download に対しても localRoot が適用されます。これにより、MCP サーバーがアクセスできる ローカルファイルが制限されます。

提供される機能

  • サーバーの検出、テスト、一覧表示、読み取り、アップロード、再帰的なデプロイ、 ダウンロード、ディレクトリの作成、名前変更、削除を行う、用途を絞った10個の MCP ツール。
  • stateDir が設定されている場合に利用できる、永続的なワークフロー用の追加ツール4個。 確認とロールバックは文書化された範囲に従います。
  • 1つのローカル設定で複数の名前付きサーバーを管理できます。
  • Gitignore に似たデプロイ除外設定、ドライラン、サーバーごとの readOnly モード。
  • FileZilla のインポート、対話型セットアップウィザード、読み取り専用の doctor コマンド。
  • 設定、環境変数、または SSH 鍵からローカルで読み込む認証情報。モデルに意図的に返されることはありません。

サーバー設定

明示的に指定した設定パスが優先されます。

  1. --config <path>
  2. --config が指定されていない場合は FTP_MCP_CONFIG

明示的に指定した設定が空、存在しない、読み取り不可、または無効な場合は、別のファイルにフォールバックせずにエラーを報告します。設定の問題を報告するために、MCP ツールは引き続き利用できます。--config にはパス引数が必要です。

いずれの指定もない場合は、最初に見つかった設定が使用されます。

  1. ./ftp-servers.json
  2. ~/.ftp-mcp/servers.json

以下の説明用の例はコメント付き JSON です。実際の設定ファイルは厳密な JSON である必要があります。 ftp-servers.example.json を使ってください。

{
  "defaultServer": "prod",
  "stateDir": "/home/alice/.local/state/ftp-deploy-mcp",
  "requirePlan": true,
  "servers": {
    "prod": {
      "protocol": "sftp",
      "host": "ssh.example.com",
      "port": 22,
      "user": "deploy",
      "password": "${ENV:PROD_PASSWORD}",
      "privateKeyPath": "~/.ssh/id_ed25519",
      "passphrase": "${ENV:PROD_KEY_PASSPHRASE}",
      "localRoot": "/home/alice/projects/site",
      "root": "/var/www/site",
      "hostKeySha256": "SHA256:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
      "readOnly": false
    }
  }
}

すべて A のフィンガープリントは、実際のホストでは意図的に機能しないため、置き換えてください。管理された鍵のローテーションでは、hostKeySha256 を配列として使用します。

"hostKeySha256": [
  "SHA256:old_verified_43_character_base64_value_here",
  "SHA256:new_verified_43_character_base64_value_here"
]

上記の説明用ラベルは形式を示すものであり、有効なピンではありません。実際の各エントリは、SHA256: に続けてパディングなしの Base64 文字列 43 文字を指定します。

フィールドリファレンス
フィールド適用対象意味
stateDir最上位省略可能な、正規化された絶対パスの永続状態ディレクトリです。すべての localRoot と正準的に重複しない必要があります。有効にすると、4 つの永続ワークフローツールが公開されます。
requirePlan最上位stateDir を指定した場合の既定値は true です。ftp_deploy のドライランを除く、従来のリモート変更ツールをブロックします。false にすると、同じ永続エイリアスロックのもとでそれらを引き続き使用できます。
stateLimits最上位状態、バックアップ、プラン、操作、プランファイル/バイト数、ジャーナルのバイト数/イベント数、バックアップファイル数に対する省略可能な厳格な永続クォータです。
protocolすべて必須です。ftp、ftps、sftp のいずれかを指定します。
host / port / userすべて接続先とアカウントです。既定のポートは、通常の FTP では 21、暗黙的 FTPS では 990、SFTP では 22 です。
passwordすべてパスワード、または ${ENV:NAME} 形式のプレースホルダーです。
privateKeyPath / passphraseSFTPSSH 秘密鍵のパスと、省略可能なパスフレーズです。先頭の ~ は展開されます。これらはユーザー認証に使用され、サーバーの検証には使用されません。
localRootすべてアップロード、デプロイ、ダウンロードに必須です。既存の絶対パスのローカルディレクトリに解決される必要があります。先頭の ~ を使用できます。相対パスやシンボリックリンク/ジャンクションを経由した逸脱は拒否されます。相対ツールパスはこのディレクトリ内に解決され、絶対ツールパスもこのディレクトリ内にとどまる必要があります。
rootすべてリモートルートです。既定値は / です。ツールパスはその配下に解決されます。SFTP ではサーバー側で realpath/lstat チェックを実行します。信頼できる境界を確保するには、FTP/FTPS ではサーバー側の chroot が必要です。
hostKeySha256SFTP必須のフィンガープリント文字列、または空でないピンの配列です。形式:SHA256:<43-character unpadded base64>。allowUnknownHostKey とは併用できません。
allowUnknownHostKeySFTP緊急時の互換性オーバーライドです。true にすると、未検証のサーバー ID を受け入れ、結果に警告を明示します。
readOnlyすべてアップロード、デプロイ、mkdir、名前変更、削除をブロックします。デプロイのドライランは引き続き利用できます。
operationTimeoutMsすべてキュー待ち時間と接続時間を含むツールの制限時間です。既定値は 120000 ms です。100~3600000 の整数を指定します。ネイティブのトランスポートタイムアウトも適用されます。
maxTransferBytesすべてファイルごとの実際の最大バイト数です。既定値は 268435456(256 MiB)、最大値は 1099511627776(1 TiB)です。正の安全な整数を指定します。
maxDeployFilesすべてデプロイごとに選択できるファイルの最大数です。既定値は 10000、最大値は 100000 です。正の安全な整数を指定します。ディレクトリ全体のスキャン数は制限しません。
maxScanEntriesすべてルート、除外対象、リンクを含む、デプロイ時に走査するローカルエントリの数です。既定値は 100000、最大値は 1000000 です。正の安全な整数を指定します。
maxScanDepthすべてルートからのディレクトリ深度です(深度 0 を含みます)。既定値は 64、最大値は 256 です。正の安全な整数を指定します。
maxDeployBytesすべてデプロイごとのソースバイト数の累計上限です。既定値は 1073741824(1 GiB)、最大値は 1099511627776(1 TiB)です。失敗した試行でも予約分は保持されます。
implicitTLSFTPS暗黙的 TLS を使用します。通常はポート 990 で使用します。
insecureTLSFTPS証明書の検証を無効にします。allowInsecure: true が必要です。
allowInsecureFTP/FTPS平文の FTP、または未検証の FTPS を明示的に許可します。接続が安全になるわけではありません。
allowUnsafeRemoteRootFTP/FTPSシンボリックリンクによる逸脱のリスクが解決されていない状態でも、/ 以外の root を許可します。サーバー側のアカウント境界を理解している場合にのみ使用してください。

すべての文字列で ${ENV:VARIABLE_NAME} を使用できます。変数が見つからない場合は、変数名を含む設定エラーが発生します。

SFTP フィンガープリントを帯域外で検証する

これから検証する接続だけを通じて取得したフィンガープリントは、信頼しないでください。

  1. ホスティングプロバイダーの認証済みコントロールパネルまたはサポート窓口から、あるいは別途認証されたチャネルを通じて管理者から、SHA-256 ホストキーフィンガープリントを取得します。
  2. ホストを管理している場合は、信頼できるコンソールを使って、次のようなコマンドを実行します。 ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub -E sha256
  3. hostKeySha256 に設定する前に、SHA256:... の値全体を照合します。ssh-keyscan で候補のキーを収集できますが、それだけではそのキーを認証できません。

ローテーションでは、新しいフィンガープリントを帯域外で検証し、古いピンと新しいピンを一時的に両方設定してから、サーバーキーをローテーションし、接続で想定どおりのキーが使われていることを確認して、古いピンを削除します。ローテーションの近道として allowUnknownHostKey を使用しないでください。

ツールリファレンス

すべてのリモートパス引数は、設定済みのリモート root からの相対パスです。defaultServer が設定されている場合、またはサーバーが 1 つだけ存在する場合、server パラメーターは省略できます。

ツール主なパラメーター用途
ftp_list_serversなしサーバーのメタデータと有効な安全性に関する警告を表示します。パスワードは表示しません。
ftp_testserver?接続して、表示可能なルートを一覧表示します。
ftp_listserver?、path?、limit?、offset?リモートディレクトリを一覧表示します。limit の既定値は 50(1~200)、offset の既定値は 0 です。
ftp_readserver?、path、max_bytes?サイズ上限のあるテキストファイルを読み込みます。バイナリデータは拒否されます。
ftp_uploadserver?、local_path、remote_path?localRoot から 1 つのファイルをアップロードします。
ftp_deployserver?、local_dir、remote_dir?、include?、exclude?、dry_run?localRoot からディレクトリを再帰的にデプロイします。
ftp_downloadserver?、remote_path、local_path、overwrite?localRoot にダウンロードします。
ftp_mkdirserver?、pathリモートディレクトリを再帰的に作成します。
ftp_renameserver?、from_path、to_path名前を変更するか、移動します。
ftp_deleteserver?、path、recursive?ファイルを削除します。明示的に再帰を指定した場合は、ディレクトリも削除します。
ftp_plan_deployserver?、local_dir、remote_dir?、include?、exclude?、ttl_seconds?不変で有効期限付きの永続プランを公開します。stateDir がある場合のみ利用できます。
ftp_apply_deployplan_id、idempotency_key、resume?永続的な適用を確認し、関連付け、明示的に再開します。
ftp_deploy_statusplan_id/operation_id のいずれか 1 つのみ、offset?、limit?、if_journal_seq?ネットワークアクセスや状態への書き込みを行わず、ロックフリーのページ分割された永続スナップショットを読み込みます。
ftp_rollback_deployoperation_id、resume?永続的に確認済みのファイルを対象に、保守的なロールバックを確認して明示的に再開します。
耐久性のあるワークフローの保証

耐久性のあるツールでは、公式の MCP input_required 確認フローが必須です。ブール値による代替手段はありません。署名付きリクエスト状態は、セッション、メソッド、プランダイジェスト、操作、冪等性キーのハッシュ、再開の選択、ジャーナルシーケンス、有効期限を関連付けます。確認の拒否、無効な操作、期限切れ、または未対応のインタラクションによって、リモート側に影響が生じることはありません。関連付けだけの場合はステータスの確認に限られます。終端状態に達していないリモート変更を行うには、resume:true が必要です。

保証レベルは observable_state_reconciled です。ファイルごとの置き換えはサーバーに依存し、複数ファイルのアトミック性と厳密に一度の実行は保証されません。ロールバックの対象は、永続的に確認済みのファイルだけです。SFTP では、既存の正規化された親ディレクトリの下で、既存ファイルの置き換えと新規ファイルの作成をサポートします。FTP/FTPS では、既存の通常ファイルの置き換えのみをサポートします。耐久性のある実行では、親ディレクトリの作成、リモート側の余分なファイルの削除、自動ロールバック、SATISFIED_UNOWNED のロールバックは行いません。

同じ正規の stateDir を共有する協調プロセスは、アダプターの構築前に、完全一致するサーバーエイリアスを直列化します。これは分散型のリモートロックではなく、異なるエイリアスや状態ディレクトリ間の調整も行いません。書き込み可能なエイリアスの重複、エイリアスの名前変更、異なるバイナリバージョンの混在アップグレード、永続ロックを保持したままのプロセス強制終了には、運用担当者による慎重な対応が必要です。アップグレード時には処理を停止し、古いロックはオフラインで復旧してください。外部の書き込みや ABA 変更は、観測可能な同一性の保証の対象外です。

検証済みのステージング昇格

アップロードとデプロイでは、予測不能な同階層の一時ファイルに書き込み、その実際のバイト数と SHA256 がローカルソースと一致することを検証してから、1 回の rename で昇格します。検証または rename に失敗しても、最終ターゲットの削除や直接上書きへのフォールバックは行いません。ダウンロードでは、排他的に作成したローカル一時ファイルを検証し、同期して閉じてから、完成したファイルを昇格します。デフォルトの overwrite:false では、途中で出現したファイルを上書きしないようハードリンクを使用します。ハードリンクに対応していないファイルシステムでは、安全側に失敗します。

ローカルおよび SFTP での置き換えでは、既存の通常ターゲットのパーミッションビット(0777)が維持されます。FTP/FTPS ではパーミッションを移植可能な方法で維持できないため、アカウント作成時のデフォルト、umask、ACL ポリシーが転送先に適している必要があります。rename の動作はサーバーとファイルシステムによって異なります。従来のアップロード/デプロイでは、すべての環境でのアトミックな置き換え、サイト単位のトランザクション、ロールバックは保証されません。読み戻しを行うとネットワークトラフィックが増加します。 転送の保証、制限、クリーンアップを参照してください。

実行、キャンセル、競合

1 つの Node プロセス内では、同じ正規化済みプロトコル、ホスト名、ポート、ユーザー名に対する upload、deploy、mkdir、rename、delete は FIFO 順で実行されます。サーバーのエイリアスとルートは同じロックを共有します。ダウンロードはサーバーをまたいで、正規化されたローカルの保存先ごとに直列化されます。読み取り専用のリモート操作は並行して実行できます。

MCP のキャンセルと期限により、アクティブなトランスポートが閉じられ、後続の deploy ファイルの処理が停止します。エラーには CANCELLED または TIMEOUT が示されます。TARGET_BUSY は、別の操作が完了するのを待っていることを示します。期限切れの呼び出しは、基盤の操作が完了する前に返ることがありますが、完了とクリーンアップが終わるまでは、その操作がロックを保持します。結果が不確かな変更操作は自動的に再試行されません。再試行する前に、リモートおよびローカルに残った状態を確認してください。従来の変更操作の呼び出しはトランザクション形式のデプロイではなく、ロールバックも行いません。

内部の準備処理は 1 回限りで、全体の操作期限を延長することなく 10 秒に制限されます。実際の処理とクリーンアップが完了するまで、受付状態は保持されます。準備済みのコンテキストは、キャンセル後に到着した場合も含め、1 回だけ解放されます。準備処理がキャンセルまたは期限切れになった場合、ハンドラーは呼び出されません。ただし、準備コールバック自体が操作を行う場合があります。永続的なツールにも同じ完了処理の規則が適用されます。リソース制限を参照してください。

進捗通知は、呼び出し元が進捗トークンを指定した場合にのみ送信されます。カウンターは単調に増加し、パスや認証情報のテキストは含まれません。ロックは他の Node プロセス、DNS エイリアス、別のアカウント、または同じホスト上の外部クライアントとは連携しません。

応答の互換性、ページネーション、アノテーション

ftp_list は、無制限のディレクトリ一覧ではなく 1 ページを返します。成功時の応答には、ページネーションフィールド total、count、offset、limit、has_more、next_offset が含まれます。たとえば、{"server":"prod","path":"/assets","limit":2,"offset":2} を指定したリクエストでは、次のような意図的に網羅性を欠く抜粋が含まれることがあります。この抜粋では、必須のトップレベルフィールド server、path、security_warning と、必須のエントリごとのフィールド size_bytes、modified_at を省略しています。

{
  "structuredContent": {
    "entries": [
      { "name": "app.css", "type": "file" },
      { "name": "app.js", "type": "file" }
    ],
    "total": 6,
    "count": 2,
    "offset": 2,
    "limit": 2,
    "has_more": true,
    "next_offset": 4
  }
}

既存の人間が読みやすい content テキストは、互換性のために維持されます。成功時には、ftp_read 以外のすべてのツールが MCP outputSchema も公開し、それに一致する structuredContent を返します。成功時の ftp_read は、引き続き上限のあるテキスト専用ツールです。9 個の構造化スキーマはいずれも、厳密な成功時の形式、または厳密な {error} エンベロープのいずれかを受け付けます。ツール実行エラーは、ローカライズされたテキストと、構造化されたコード、リクエスト UUID、影響に関する観測結果、安全な再試行の指針を伴って isError: true を返します。不明なツールは引き続きプロトコルエラーとなります。エラー仕様を参照してください。

このプロセスでは、キャンセル後のクリーンアップ中のワーカーも含め、最大 64 件のツール呼び出しを受け付けます。上限を超えた呼び出しは CAPACITY_LIMIT を返します。ローカルのデプロイスキャンは非同期で、別途上限が設定されています。正確なカウント方法、SCAN_LIMIT、修正されたカスタム除外動作については、リソース制限を参照してください。

すべてのツールは、読み取り専用、破壊的、冪等、オープンワールドの動作を記述する MCP アノテーションを公開します。これらのアノテーションはクライアント向けのヒントであり、セキュリティ境界ではありません。上記のサーバー認証情報、readOnly、localRoot、プロトコル制御を使ってアクセスを制限してください。ftp_deploy の構造化結果には、網羅的なファイル一覧ではなく、要約と上限付きのサンプルが含まれます。

ftp_deploy はトランザクションではありません。1 件以上の転送に失敗した場合、ツールは一部のデプロイ状況をまとめた MCP エラーを返します。失敗前に昇格済みのファイルはロールバックされません。

デフォルトのデプロイ除外対象には、node_modules、.git、環境ファイル、ログ、OS メタデータ、ftp-servers.json、および任意の階層にある .ftp-mcp の内容が含まれます。予約済みの .ftp-mcp-*.tmp というベース名は、明示的な include パターンに一致する場合も常に除外されるため、デプロイ対象としてダウンロード途中の一時ファイルが選ばれることはありません。

クライアントのセットアップ

npm run setup は対応クライアントを検出し、既存のクライアント設定を変更する前にタイムスタンプ付きのバックアップを作成して、UI のみで設定するクライアント向けのブロックを表示します。クライアントを手動で接続するには、以下のパスをこのチェックアウトの絶対パスに置き換えてください。

{
  "mcpServers": {
    "ftp": {
      "command": "node",
      "args": ["/absolute/path/to/ftp-deploy-mcp/src/index.js"]
    }
  }
}

一般的な場所には、Claude Code の .mcp.json、Cursor の ~/.cursor/mcp.json、Windsurf の ~/.codeium/windsurf/mcp_config.json などがあります。Claude Desktop などのクライアントは、MCP 設定を通じて同じコマンド/引数の構造を受け付けます。

公開されている npm パッケージは、代わりに npx -y [email protected] で起動できます。更新前に正確なバージョンを確認してください。バージョンを固定しても、npm の推移的依存関係の解決までは固定されません。

FileZilla のインポートと診断

node src/index.js import-filezilla --file /path/sitemanager.xml --out ./ftp-servers.json
npm run doctor

インポートしたパスワードは、平文にデコードされる場合があります。出力をバージョン管理の対象外に保ち、アクセス権を制限し、localRoot を追加してから、接続前に安全でない転送方式や FTP/FTPS のリモートルートに関する警告をすべて確認してください。 doctor は読み取り専用で、パスワードを表示せずに設定とクライアントの接続状況を報告します。

v0.1 から v0.2 への移行

上記の提供状況へのリンクには、公開済みバージョン 0.3.2 が記載されています。以下の移行手順は、v0.1 以降に導入されたセキュリティ変更について説明するもので、既存のリリースタグの再公開や移動は必要ありません。

  1. アップロード、デプロイ、またはダウンロードに使用する各サーバーに、絶対パスの localRoot を追加します。
  2. 各 SFTP サーバーに、帯域外で検証済みの hostKeySha256 を追加します。allowUnknownHostKey: true を使用するのは、一時的かつ明示的にリスクを受け入れる場合のみにしてください。両方のフィールドを設定しないでください。
  3. FTP/FTPS では、表示されるルートが / となる専用のサーバー側 chroot を優先し、root を / に設定してください。ルート以外のクライアントパスには allowUnsafeRemoteRoot: true が必要となり、サーバー側のシンボリックリンクに対する安全性は保証されません。
  4. ftp_deploy が失敗した場合は、デプロイが部分的に完了したものとして扱ってください。概要を確認し、再試行する前にリモートのツリーを整合させてください。
  5. npm run setup を再実行するか、MCP クライアントのコマンドをこのチェックアウトに更新してから、npm run doctor とドライランを実行します。

新たに書き込まれる機密設定のアトミック置換はリリーステストで検証されますが、バージョン番号だけではその保証は確立されません。適格性の確認と公開手順については、docs/RELEASE.md を参照してください。

セキュリティと制限事項

  • FTP/FTPS で最も強固な境界となるのは、サーバー自体のアカウント分離または chroot です。クライアント側の正規化では明白なパストラバーサルを拒否しますが、FTP には移植性のある REALPATH/LSTAT プリミティブがなく、サーバー側のシンボリックリンクが設定済みのサブルート内に留まることを証明できません。
  • SFTP はホストキーのピンを検証し、realpath/lstat を使用してシンボリックリンクの構成要素を拒否します。それでも、攻撃者が制御するサーバーは、チェックと操作の間にファイルシステムの状態を変更できる可能性があります。
  • readOnly は、この MCP サーバーを介した意図しない書き込みを抑制します。リモートサーバーが適用する読み取り専用の認証情報に代わるものではありません。
  • FTP、insecureTLS、allowUnknownHostKey、allowUnsafeRemoteRoot は、明示的なリスク受容であり、セキュリティ機能ではありません。

セキュリティモデルと非公開の脆弱性開示ポリシーをすべてお読みください。

開発

npm test
npm run eval:scripted
node src/index.js --version
node src/index.js --help

テストスイートではローカルの FTP サーバーと SFTP サーバーを使用するため、外部ネットワークは不要です。コントリビューションを歓迎します。詳しくは CONTRIBUTING.md をご覧ください。メンテナーは リリースガイドを使用してください。再現可能な、外部ホスト型の読み取り専用エージェント評価については、evaluations/README.mdに記載されています。

ソースのチェックアウトから npm run eval:scripted を実行すると、実際の SDK クライアントとハンドラーを通じて、メモリ内のリモートアダプターを使用し、両言語で 43 ケースを実行します。これは、スクリプトによるサーバー適合性テスト 86 件に相当します。レポートと制限事項については、スクリプト適合性ガイドを参照してください。このコマンドはモデルを評価するものではなく、別途実施する実際の転送テストに代わるものでもありません。

ライセンス

MIT — LICENSEをご覧ください。

作者

パリを拠点に活動するエージェント型 AI アーキテクト兼外部 CAIO の Alexandre Beguel が構築・保守しています。本番環境向け GenAI、LLMOps、LLM FinOps、エビデンスを重視した AI ガバナンスに取り組んでいます。beguel.com · LinkedIn · 英語・フランス語・スペイン語のプロフィール

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。