Skip to main content
Glama
mcp-gate

mcp-gate

by jbisaccia-9

mcp-gate

ci

パスはリクエストである。ルートの境界が保証である。

MCP ファイルアクセスサーバーは、モデルが触れてよいファイルを roots(許可されたディレクトリの集合)によって強制します。mcp-gate は、サーバーに「ルート内に留まる」と指示することと、強制することの違いを示します。同じ攻撃スイートを、指示しか持たないバージョンと、読み取り前にすべてのパスを正規化して境界と照合するバージョンの両方に対して実行します。一方は漏えいし、もう一方は守ります。両方向が CI で強制されます。

これは、Anthropic の高度な MCP 教材の概念を独立して実装したもので、次の 3 点を明示的に示すために書かれています。

機能

確認できる場所

高度な MCP サーバー

src/mcp_gate/server.py — 型付きツール(list_roots、read_file、list_dir、summarize_file)を公開する FastMCP サーバーです。構造化エラーと、サーバー起点のサンプリング(ctx.session.create_message)を備えており、サーバーがクライアントにモデルの実行を依頼できるようになっています。

ログと進捗

すべてのツールは、実行時に MCP のログ通知(ctx.info)と進捗(ctx.report_progress)を送信します。リクエストが境界でブロックされた正確な瞬間のログも含まれます。src/mcp_gate/client.py には、対応する logging_callback / sampling_callback が示されています。

アクセス制御

src/mcp_gate/boundary.py — 保証です。.. トラバーサル、絶対パス、シンボリックリンク脱出、%2e エンコードされたトラバーサルは、すべて roots チェックの前に正規化されます。これがゲートです。

2つのモード

モード

判定方法

結果

prompt(安全でない対照)

システムプロンプトの指示は「roots 配下のファイルのみを読み取る」と言うが、パスは渡されたとおりに開かれます。

漏れる — 素朴なパスハンドラーは、意図的に最悪のケースの対照となっています。

boundary(強制)

各パスはデコードされ、realpath で解決され(.. を畳み込み、シンボリックリンクを追跡)、許可された root 内に収まることが要求されます。

漏れない — 範囲外のリクエストは、ファイルを開く前に拒否されます。

攻撃スイート

攻撃

prompt モード

boundary モード

direct_ask(ルート内の正当なファイル)

配信 ✓

配信 ✓

dotdot_traversal(../out_of_bounds/secret.txt)

漏れる

ブロック

absolute_path(秘密ファイルへの絶対パス)

漏れる

ブロック

symlink_escape(サンドボックス内部から外部へのシンボリックリンク)

漏れる

ブロック

encoded_traversal(%2e%2e/...)

漏れる

ブロック

プロンプト層のセキュリティを手短に手動テストすると安全そうに見えるが、試していない攻撃で破綻してしまうためです。

Related MCP server: personal-mcp-bridge

ゲート(CIによる双方向強制)

python -m mcp_gate gate boundary   # exit 0 only if 0 escapes
python -m mcp_gate gate prompt      # exit 0 only if the leak is still demonstrated
python -m mcp_gate suite            # both halves must hold

gate prompt が漏れないということは、デモが空虚になったことを意味します(安全でない側も通ってしまうならば、「安全」な結果は無意味だからです)。そのため CI は それ もビルド失敗として扱います。

クイックスタート

python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

pytest -q
python -m mcp_gate gate boundary
python -m mcp_gate gate prompt
python -m mcp_gate suite

ライブの MCP サーバーとクライアントのデモを実行します(サンプリングツールには pip install -e ".[demo]" と、環境内の ANTHROPIC_API_KEY が必要です):

python -m mcp_gate serve ./data/sandbox      # start the server over stdio
python -m mcp_gate.client ./data/sandbox     # drive it: logs, progress, sampling, a blocked attack

RESULTS.md にキャプチャされた出力があります。そこにあるすべてのブロックは実際のコマンド出力であり、scripts/make_results.py によって再生成され、手動編集されたものではありません。

注意

  • data/ 配下のデータはすべて架空です。data/out_of_bounds/secret.txt は「サーバーが決して供給してはならないファイル」を示すラベルの付いた代役です。

  • この -gate シリーズの一部: 自作のゲートを通過するまで何も出すことはありません。

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables safe, read-only browsing of allowlisted local directories through MCP, providing tools to list roots, read files, and search text.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides safe, allowlisted local filesystem access for MCP-compatible AI clients, enabling directory listing, file reading/writing (with byte limits), and text search while blocking paths outside approved roots and symlink escapes.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables secure filesystem operations (read, write, list, move, search files/directories) through the Model Context Protocol, with dynamic directory access control via MCP Roots.
    -