Skip to main content
Glama

sweep-mcp

ディレクトリを削除するMCPサーバーと、その能力を言語モデルに委ねることを無謀にしないためのガードレール。

このサーバーはsweepをModel Context Protocolで公開するため、エージェントがnode_modules、.venv、target、__pycache__などを見つけて回収できる。興味深いのは削除そのものではなく、削除が許可されるために満たさなければならないすべての条件である。

2026年に発表された調査では、スキャンされた**1,808のMCPサーバーの66%**にセキュリティ問題が見つかり、1四半期だけで30以上のCVEがMCP実装に対して提出された。このリポジトリは、拒否を最優先に、機能を後回しにしたサーバーの一例である。


脅威モデル

ディレクトリを削除できるMCPサーバーは、プロセスが到達可能なすべてに対して向けられた装填済みの銃である。5つの問題が発生する可能性があり、それぞれに制御とそれを発火させるテストがある。

リスク

制御

テスト

エージェントが/またはC:\をスキャンしてマシンを削除する

ルート許可リスト、サーバー起動時に固定。エージェントは設定、拡張、読み取り不可。ルート未設定→すべてのリクエストを拒否

test_empty_allowlist_denies_every_path

../../またはシンボリックリンクで許可リストを回避する

すべてのパスは包含チェックの前にresolve()されるため、実際の場所に基づいて判断される

test_dotdot_traversal_is_denied、test_symlink_pointing_outside_root_is_denied

エージェントがスキャンしていないパスの削除を要求する

reclaimはIDを受け取り、パスは受け取らない。 APIのどこにもパス形式の削除ルートは存在しない

test_there_is_no_way_to_delete_by_path

スキャンと削除の間にディレクトリが変更される

すべての検出は削除時にライブファイルシステムに対して再チェックされる—依然として含まれ、ディレクトリであり、リンクではなく、マーカーファイルが存在する

test_revalidate_refuses_a_directory_swapped_for_a_symlink

偶発的な破壊

ドライランがデフォルト。 削除にはconfirm="delete"を正確に必要とし、それ以外は無しとして扱われる

test_a_wrong_confirmation_string_stays_a_dry_run

同じ理由で、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つの定義のいずれにも、ツールポイズニング、クロスオリジン、またはラグプルパターンは検出されなかった。

割り当てられたリスク評価は再現する価値がある。なぜなら、それらは示唆に富む方法で間違っているからである:

ツール

評価

推測される権限

list_targets

MEDIUM

SHELL_EXEC、FILE_READ

scan

HIGH

FILE_DELETE、SHELL_EXEC、FILE_READ

reclaim

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"]
    }
  }
}

ツール

ツール

破壊的

動作

list_targets

いいえ

回収方法を知っているディレクトリの種類と、それぞれを再生成するコマンド

scan

いいえ

ルート内のパス以下で回収可能なディレクトリを検索。ID、サイズ、再生成コマンドを返す

reclaim

はい

IDで検出結果を削除。confirm="delete"でない限りドライラン。

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 would

guard.pyは意図的にMCPについて何も知らない。データを失う可能性のある全ての決定は、クライアント、トランスポート、エージェントを介さずにテスト可能である。server.pyでルールが強制されているように見える場合、それはバグである—それは1層下に属し、テストが到達できる場所にある。

ライセンス

MIT.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to clean disk space by scanning and removing temporary files, caches, and duplicates through natural language commands via MCP protocol.
    1
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides git-aware safe file operations, allowing AI agents to delete files while protecting git-tracked source code from accidental deletion.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to audit and clean development workspaces safely by detecting reclaimable artifacts, exposed .env files, and potential secret leaks.
    6
    MIT