mcpField
A
archive-zip-unzip-bomb-guard

archive-zip-unzip-bomb-guard

ローカル
mcp.zovo.oneファイル・ストレージ21 日前に更新

archive-zip-unzip-bomb-guard について

archive-zip-unzip-bomb-guardは、ZIPアーカイブの作成、検査、展開を行うローカルMCPサーバーです。展開前にヘッダーを確認し、パストラバーサル、シンボリックリンク、圧縮爆弾を防ぎます。

主な機能

  1. 01ファイルやglobパターンからZIPを作成
  2. 02エントリー、サイズ、危険項目を一覧表示
  3. 03安全確認とドライラン付きで展開
  4. 04アーカイブを展開せずテキスト項目を読む
  5. 05既存アーカイブにファイルを追加
  6. 061か月分の請求書やエクスポートをまとめる

活用シーン

  1. 01メールで届いたアーカイブを開く前に検査
  2. 02パストラバーサルや圧縮爆弾を防いで展開
  3. 03全体を展開せずREADMEを読む
  4. 04会計担当者向けに月次の請求書などをまとめる

MCP 対応

ZIPの作成、検査、展開などのツールをMCPクライアントに公開します。ローカルで動作し、ネットワーク通信は行いません。

設定

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

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
mcpbzip.mcpb0.21.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

mcp-zip

今いる会話の中で、ZIP の作成、内容の確認、展開ができます。フォルダーを glob で指定して圧縮できます (**/*.csv、node_modules 以外すべて)。アーカイブを展開せずに、中から README を 1 つ読み取れます。 誰かから送られてきた ZIP の中身を尋ねれば、開く前に、絶対パス、..、シンボリックリンク、 重複した名前、そして 199 KB のファイル内に 200 MB あると申告するエントリーについて教えてくれます。1 か月分の請求書、 見積書、エクスポートを 1 つのファイルにまとめて、会計士に送れます。すべてお使いのマシン上で実行されます。アップロードも、 アカウントも、API キーも、ネットワークへの接続も一切必要ありません。

公式 MCP レジストリ に登録されています(io.github.theluckystrike/zip-archive-create-extract-bomb-guard)。

ZIP のデモ

@theluckystrike/mcp-zip の npm 公開は保留中のため、現時点で npx -y @theluckystrike/mcp-zip を実行すると 404 が返されます。それまでは、ワンクリックで使える .mcpb バンドル、またはクローンしてビルドする方法をご利用ください。

インストール

Claude Desktop の場合、~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)に設定します。

{
  "mcpServers": {
    "zip": { "command": "npx", "args": ["-y", "@theluckystrike/mcp-zip"] }
  }
}

Claude Code の場合:

claude mcp add zip -- npx -y @theluckystrike/mcp-zip

Cursor の場合、.cursor/mcp.json に設定します。

{
  "mcpServers": {
    "zip": { "command": "npx", "args": ["-y", "@theluckystrike/mcp-zip"] }
  }
}

ツール

ツール機能
zip_createファイル、または glob パターンで指定したディレクトリーツリーを新しい .zip に圧縮します
zip_list各エントリーのサイズ、圧縮サイズ、圧縮率を表示し、危険な内容があればすべて警告します
zip_extractパストラバーサル、シンボリックリンク、ZIP 爆弾を防ぐガードと dry_run を備えて、ディレクトリーに展開します
zip_add既存のアーカイブにファイルを追加します
zip_extract_text展開せずに、テキストエントリーを 1 つインラインで読み取ります
zip_bundle_month兄弟サーバーから 1 か月分の請求書、見積書、エクスポートを 1 つのファイルにまとめます
zip_history作成したものと、今月の無料利用枠の残りを確認できます
license_status, license_activateFree または Pro の確認と、キーの有効化を行います

Free と Pro の違い

FreePro
暦月あたりのアーカイブ数20無制限
アーカイブのサイズ最大 25 MB無制限
アーカイブあたりのエントリー数最大 200無制限
読み取り:zip_list、zip_extract、zip_extract_text無制限無制限
ZIP 爆弾、パストラバーサル、シンボリックリンクに対するガードありあり

読み取りは使用量にカウントされません。無料プランに制限があるのは、書き込みだけです。誰かから送られてきたアーカイブこそ、開く前に確認する必要があるものであり、安全確認の前にペイウォールを設けることになれば、その安全確認をペイウォールで遮ることになるからです。

Pro を入手するには、https://mcp.zovo.one/buy/zip をご覧ください。1 回限りの $19、またはスイート内のすべてのサーバーを利用できる $39 で、いずれも永久ライセンスです。キーはオフラインで検証され、外部に情報が送信されることはありません。

手書きのライターではなくfflateを選んだ理由

選択肢は、fflate(純粋なJS、依存関係なし、同期的なzipSync/inflateSync)と、依存関係がまったく不要なnode:zlibを使ってSTORE/DEFLATEライターを書くことでした。

どちらを選んでも、ここではコンテナ形式を記述します。このサーバーはsrc/zipfile.tsで中央ディレクトリを自前で読み取ります。サイズ、名前、メソッド、CRC、外部属性など、およそ200行にわたります。サーバーの各ガードは、展開する前にヘッダーから判断するため、これは必須です。{name: bytes}を返すライブラリでは、中身を確認できる時点ですでに爆弾が展開されています。そのため、ライブラリを使う理由は「形式の実装を省けること」ではありませんでした。

残るのは圧縮処理ですが、ここは自分で実装すべきではありません。node:zlibでも処理できますが、raw-deflate呼び出しは非同期が前提で、呼び出しごとにスレッドプールを経由します。また、同期版は呼び出すたびにネイティブストリームを作成します。小さなファイルを200個まとめる場合、これが200回発生します。fflateのdeflateSyncは、ネイティブハンドルを使わない純粋なJSの実装で、200個のファイルを74ミリ秒で圧縮します(以下で計測)。さらに、パッケージにネイティブビルドの手順を追加せずに済みます。これはこのスイート全体のルールです。npxがどこでも動作する必要があります。

トレードオフは明確です。fflateはアーカイブを1つのバッファーに構築するため、このサーバーはストリーミングできるかのように装わず、512 MBを超える入力を拒否します。また、ZIP64(4 GB超、または65,535件を超えるエントリー)は読み取りません。誤読するのではなく、ZIP64であることを検出して拒否します。

計測結果:ファイルの種類ではなく、繰り返しが圧縮率を左右します

以下のファイルはすべて、このマシンでレベル6を指定してZIP圧縮しました。「種類」は人がファイルをどう呼ぶか、「圧縮率」は実際の結果を示しています。

ファイル種類バイト数圧縮後圧縮率
mcp-pdfの12ページの請求書PDF15,12514,1181.07x
mcp-docxの400段落の契約書DOCX9,8977,3111.35x
値にばらつきのある請求CSV 4,000行CSV321,329134,0492.40x
このサーバー自身のindex.tsソースコード39,49811,9383.31x
package-lock.jsonJSON138,83533,2234.18x
アプリのログ20,000行ログ1,603,390106,26115.09x
クライアント名40件を繰り返した請求CSV 4,000行CSV338,5494,09482.69x
ゼロバイト50 MB爆弾52,428,80051,2941022x

PDFとDOCXはほとんどサイズが変わりません。中身を見れば意外ではありません。どちらもすでにdeflate形式のコンテナなので、もう一度ZIP圧縮しても、圧縮ではなくパッケージングにすぎません。請求書を1か月分まとめるのは、1つのファイルにする点では有用ですが、容量の削減にはなりません。

興味深いのは、CSVの2行です。同じツール、同じ形式、同じようなサイズでも、34倍の差があります。クライアント名40件を繰り返すデータは82.69倍に圧縮され、値がすべて異なるデータは2.40倍でした。「CSVである」という情報だけでは、どちらなのかは予測できません。

計測結果:爆弾の上限を50倍ではなく100倍にする理由

圧縮爆弾は圧縮率で拒否されます。そこで、ゼロのファイルが達する1022倍より十分に低く、上限を低めに設定したくなるのは自然です。しかし、上の表が示すように、それは誤りです。経費トラッカーからzip_bundle_monthが収集するような実際のCSVエクスポートでは、82.69倍に達しました。これは100倍の上限の83%に相当し、50倍を大きく上回ります。爆弾より十分に低くなるように調整した上限では、実際の月次エクスポートまで拒否してしまいます。そうなると、利用者はすべての処理でmax_ratioを渡すようになり、ガードが恒久的に無効化されます。

そのため、圧縮率は2番目のガードであり、1番目ではありません。最初にチェックするのは合計サイズです。選択したエントリーについて、申告されている展開後のサイズを合計し、上限(デフォルトでは1 GB。変更するにはmax_total_mbを指定します)と比較します。199 KBのファイルから200 MBが展開されるかどうかは、個々のエントリーを評価せずにアーカイブ全体について判断できるからです。どちらの情報も中央ディレクトリから読み取れるため、爆弾を拒否するのに展開処理は一切必要ありません。

refuse a 500 MB bomb (497.8 KB on disk)   3 ms, nothing inflated, out_dir not even created

実測:上限付き出力バッファーは爆弾対策にはなりません

fflate.inflateSync(data, { out: new Uint8Array(n) }) で解決するように見えます。バッファーに上限を設ければ、被害も抑えられるというわけです。しかし、実際にはそうではなく、問題が起きても気づきにくい形で現れます。100,000 バイトのエントリーを 10 バイトのバッファーに展開すると、10 バイトが返され、例外は発生しません。100 KB のエントリーに対してヘッダーが 10 バイトと宣言しているアーカイブは、10 バイトのファイルとして展開され、成功と報告されますが、切り詰められたことは見えません。

つまり、バッファーでメモリを制限し、中央ディレクトリの CRC-32 でバイト列を検証します。このサーバーが書き出すすべてのエントリーは、ディスクに書き込まれる前にヘッダーと照合してチェックサムが検証され、不一致があればエントリー名を示して拒否されます。このチェックにより、偽りのヘッダーによるサイレントなデータ損失を、エラーとして明示できます。

処理時間

M シリーズのノートパソコン、stdio 経由、1 回あたり、コールドストア:

操作実測値
zip_create、200 ファイル、4.0 MB74 ms
zip_list、200 エントリー2 ms
zip_extract、200 エントリー47 ms
zip_extract_text、1 エントリー1 ms
500 MB の爆弾を拒否3 ms
テストスイート全体、38 テスト、5 ファイル3.9 s

プライバシー

すべての処理はお使いのマシン上で完結します。このサーバーにはネットワークコードが一切ありません。fetch も HTTP クライアントもテレメトリーもありません。アーカイブは指定した場所に書き込まれ、作成したものを記録する小さなレジストリは ~/.local/share/mcp-servers/zip/(または $XDG_DATA_HOME)に保存されます。ライセンスキーは公開鍵を使ってオフラインで検証されます。

Zip パスワードには対応しておらず、渡された場合は無視せず拒否します。従来の Zip 暗号は破られており、AES Zip 暗号化はベンダー拡張で、ツール間で仕様が統一されていません。そのため、ここで作成した「パスワード保護」アーカイブは、誤解を招くものになってしまいます。

theluckystrike が開発しました。サポート:[email protected]

これらのドキュメントを MCP サーバーとして使用する

あらゆる MCP クライアント(Claude、Cursor、Windsurf、VS Code)から、インストール不要で GitMCP 経由でこのリポジトリのドキュメントを直接読み取れます。

コメント

MCP は初めてですか?

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

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