sweep-mcp
sweep-mcp
ディレクトリを削除するMCPサーバーと、その能力を言語モデルに委ねることを無謀にしないためのガードレール。
このサーバーはsweepをModel Context Protocolで公開するため、エージェントがnode_modules、.venv、target、__pycache__などを見つけて回収できる。興味深いのは削除そのものではなく、削除が許可されるために満たさなければならないすべての条件である。
2026年に発表された調査では、スキャンされた**1,808のMCPサーバーの66%**にセキュリティ問題が見つかり、1四半期だけで30以上のCVEがMCP実装に対して提出された。このリポジトリは、拒否を最優先に、機能を後回しにしたサーバーの一例である。
脅威モデル
ディレクトリを削除できるMCPサーバーは、プロセスが到達可能なすべてに対して向けられた装填済みの銃である。5つの問題が発生する可能性があり、それぞれに制御とそれを発火させるテストがある。
リスク | 制御 | テスト |
エージェントが | ルート許可リスト、サーバー起動時に固定。エージェントは設定、拡張、読み取り不可。ルート未設定→すべてのリクエストを拒否 |
|
| すべてのパスは包含チェックの前に |
|
エージェントがスキャンしていないパスの削除を要求する |
|
|
スキャンと削除の間にディレクトリが変更される | すべての検出は削除時にライブファイルシステムに対して再チェックされる—依然として含まれ、ディレクトリであり、リンクではなく、マーカーファイルが存在する |
|
偶発的な破壊 | ドライランがデフォルト。 削除には |
|
同じ理由で、2つの小さなもの:
チケットIDはランダムであり、連番ではない。
f-3a91c02b77de、1ではない。連番のIDはエージェントが何かを削除するまで反復するよう誘う。ツールの説明は文字列リテラル。 ディスクから読み取ったものから組み立てられることは決してないため、
ignore-previous-instructionsという名前のディレクトリは、モデルに対して文ではなくデータとして届く(test_tool_descriptions_are_static)。
Related MCP server: MCP Duplicate File Manager Server
防御しないもの
上記の制御は、それらがカバーする範囲でのみ有効であり、それ以上ではない。
ルートの設定ミス。
--root /で起動すると、ファイルシステムを喜んで操作する。許可リストはそこに入力したものと同じくらいの品質であり、ここではその選択に疑問を呈するものは何もない。悪意のあるクライアント。 ガードは何が削除されるかを制限するが、誰が要求しているかは制限しない。正当にスキャンし、正当に確認するクライアントは、要求したものを正確に得る。
説得されたエージェント。 静的なツールの説明により、ファイルシステムの内容がモデルの指示に含まれることを防ぐが、ここでは、エージェントが自身の悪い理由で、実際に見つけた本物の
node_modulesを削除することを決定するのを止めることはできない。最後の数ミリ秒。
revalidate()はチェックと削除の間の時間を狭めるが、それをなくすわけではない。適切になくすには、操作全体にわたってディレクトリファイル記述子を保持する必要があるが、shutil.rmtreeはそれを移植可能な方法で提供しない。これは実際の競合であり、より小さくなっただけで、存在しないわけではない。Python 3.11でのWindowsジャンクション。
os.path.isjunctionは3.12で追加された。それ以前では、ジャンクション検出はシンボリックリンクのみに低下する—これはsweep自体が行うのと同じ妥協であり、ここで埋もれずに明示されている。権限。 これはサンドボックスではない。起動したユーザーの権限で動作する。
スキャナー結果
2026年8月18日、agent-audit 0.19.2に対して実行。
静的スキャン—0件の検出、リスクスコア0.0(LOW)、7ファイル。
最初のパスで1件の低い検出があった:AGENT-110、ソースマップアーティファクトが配布から除外されていない。このパッケージはJavaScriptを出荷しないため、漏洩するソースマップはなかったが、除外はpyproject.tomlに宣言されている—コストはかからず、サプライチェーンチェックリストと議論することは、誰の午後も無駄にするだけである。
ツール検査—0件のツール検出。 3つの定義のいずれにも、ツールポイズニング、クロスオリジン、またはラグプルパターンは検出されなかった。
割り当てられたリスク評価は再現する価値がある。なぜなら、それらは示唆に富む方法で間違っているからである:
ツール | 評価 | 推測される権限 |
| MEDIUM | SHELL_EXEC、FILE_READ |
| HIGH | FILE_DELETE、SHELL_EXEC、FILE_READ |
| HIGH | FILE_DELETE、SHELL_EXEC、FILE_READ |
scanは何も削除できない。読み取り専用であり、read_only_hint=Trueと宣言され、それがそのままであることを主張するテストもある。FILE_DELETE権限でHIGHと評価された理由は、スキャナーが説明の中のキーワードを照合するためであり、このサーバーのscanの説明には次の文が含まれている:
"Read-only: this never deletes anything."
deletesという単語がFILE_DELETEキーワードリストに含まれている。SHELL_EXECは、「そのコマンド」という文にある「command」という単語から来ている—このサーバーはシェルコマンドを一切実行しない。
説明を言い換えればスコアは改善する。しかし、そうしていない。なぜなら、説明の対象はツールを呼び出すかどうかを決定する言語モデルであり、「this never deletes anything」はその中で最も有用な文だからである。キーワードスキャナーは煙探知機であり、裁判官ではない—クリーンな実行は価値があり、公開する価値がある。散文の文字列マッチングから導き出された評価は、いずれの方向の振る舞いについての証拠ではない。
2つのスキャナーを試し、1つは実行できなかった:Invariant Labsのmcp-scanはSnyk買収に伴いsnyk-agent-scanに改名され、現在はSNYK_TOKENが必要。Ciscoのmcp-scannerはPyPIに公開されていない。agent-audit自身のstdioトランスポートも、手動ハンドシェイクが同一のバイナリに対してミリ秒で返る間、Windowsでこのサーバーに対してタイムアウトするため、そのアナライザーには実際のtools/list出力を直接供給した—トランスポートはバイパスされたが、分析はバイパスされなかった。
インストール
pip install -e .設定
サーバーは1つ以上の--rootディレクトリを受け取る。デフォルトはない。 ルートなしで起動するとエラーとなり、すべてをスキャンする招待にはならない:
{
"mcpServers": {
"sweep": {
"command": "sweep-mcp",
"args": ["--root", "/home/you/code", "--root", "/home/you/work"]
}
}
}ツール
ツール | 破壊的 | 動作 |
| いいえ | 回収方法を知っているディレクトリの種類と、それぞれを再生成するコマンド |
| いいえ | ルート内のパス以下で回収可能なディレクトリを検索。ID、サイズ、再生成コマンドを返す |
| はい | IDで検出結果を削除。 |
3つすべてがMCP ToolAnnotationsを持っているため、破壊的なツールを確認プロンプトの後ろにゲートするクライアントは必要なものを持っている:reclaimはdestructive_hint=True、他の2つはread_only_hint=Trueを宣言している。これはスイートでも主張されている—静かに後退したヒントは、ないよりも悪い。
セッション例
scan(path="/home/you/code")
→ 12 finds, 3.4 GB
f-3a91c02b77de /home/you/code/api/node_modules 1.9 GB npm install
f-8e0244fd1b6c /home/you/code/ml/.venv 842 MB python -m venv .venv
reclaim(ids=["f-3a91c02b77de"])
→ dry_run: true
would_delete: 1 path, 1.9 GB
note: Nothing was deleted. Call again with confirm='delete'.
reclaim(ids=["f-3a91c02b77de"], confirm="delete")
→ deleted: 1 path, reclaimed 1.9 GBテスト
38テスト。Windowsで34実行、Linuxで全38実行。
ローカルでスキップされる4つはシンボリックリンクを作成する必要があり、Windowsは開発者モードなしではそれを拒否する—そしてそのうちの1つはスキャンと削除の間のスワップ攻撃をカバーしており、これはここで最も重要なテストである。静かにスキップするとスイートは飾りになるため、CIはLinuxで実行され、これらのテストがそこでスキップとして報告された場合、ビルドは失敗する。
pytest -q --cov=sweep_mcpカバレッジは83%。ギャップは主にmain()とargparseの配線であり、スイートは代わりにbuild_serverを通じて駆動する—トランスポートは最もモックする価値がなく、ダメージが発生する可能性が最も低い部分である。
スイート内でファイルシステムをモックするものはない。モックされたPathは、ここで全てのテストに合格するが、サーバーは依然として間違ったディレクトリを削除する。
レイアウト
src/sweep_mcp/
guard.py 212 lines - the allowlist, the tickets, the re-check. Imports no MCP.
server.py 280 lines - three tools. Translation only.
tests/
test_guard.py 23 tests - one per rule, each named for the attack it stands in for
test_server.py 15 tests - driven through call_tool, the way a client wouldguard.pyは意図的にMCPについて何も知らない。データを失う可能性のある全ての決定は、クライアント、トランスポート、エージェントを介さずにテスト可能である。server.pyでルールが強制されているように見える場合、それはバグである—それは1層下に属し、テストが到達できる場所にある。
ライセンス
MIT.
This server cannot be deployed
Maintenance
Related MCP Connectors
Blocks typosquatted or hallucinated npm/PyPI packages before an AI agent installs them.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
Securely search and manage workspace context files for AI agents and teams.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to clean disk space by scanning and removing temporary files, caches, and duplicates through natural language commands via MCP protocol.1-
- FlicenseAqualityDmaintenanceEnables LLM agents to find and safely delete duplicate files using content-based detection, with smart copy prioritization and dry-run mode.3-
- AlicenseNot gradedqualityBmaintenanceProvides git-aware safe file operations, allowing AI agents to delete files while protecting git-tracked source code from accidental deletion.MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to audit and clean development workspaces safely by detecting reclaimable artifacts, exposed .env files, and potential secret leaks.6MIT