Skip to main content
Glama
jbisaccia-9

mcp-gate

by jbisaccia-9

mcp-gate

ci

Ein Pfad ist eine Anfrage. Die Roots-Grenze ist die Garantie.

Ein MCP-Dateizugriffsserver erzwingt über roots — eine Menge autorisierter Verzeichnisse —, welche Dateien ein Modell berühren darf. mcp-gate demonstriert den Unterschied zwischen der Anweisung an den Server, innerhalb seiner Roots zu bleiben, und der Durchsetzung dieser Anweisung: Dieselbe Angriffssuite wird gegen eine Version ausgeführt, die nur eine Instruktion besitzt, und gegen eine Version, die jeden Pfad kanonisiert und ihn vor jedem Lesevorgang gegen die Grenze prüft. Eine leakt; die andere hält. Beide Richtungen werden in CI erzwungen.

Dies ist eine unabhängige Implementierung von Konzepten aus Anthropics fortgeschrittenem MCP-Material, geschrieben, um drei Dinge ausdrücklich zu zeigen:

Fähigkeit

Wo sie sichtbar wird

Fortgeschrittener MCP-Server

src/mcp_gate/server.py – ein FastMCP-Server, der typisierte Werkzeuge (list_roots, read_file, list_dir, summarize_file) bereitstellt, mit strukturierten Fehlern und server-initiiertem Sampling (ctx.session.create_message), damit der Server den Client bitten kann, das Modell auszuführen.

Logs & Fortschritt

Jedes Werkzeug streamt während der Ausführung MCP-Log-Benachrichtigungen (ctx.info) und Fortschritt (ctx.report_progress) – einschließlich des genauen Moments, in dem eine Anfrage an der Grenze blockiert wird. src/BU/unlike_gate/client.py zeigt die zugehörigen logging_callback / sampling_callback.

Zugriffskontrolle

src/mcp_gate/boundary.py – die Garantie: ..-Traversal, absolute Pfade, Symlink-Ausbrüche und %2e-kodiertes Traversal werden vor der Roots-Prüfung normalisiert. Das ist das Gate.

Die beiden Modi

Modus

Entscheidungsgrundlage

Ergebnis

prompt (unsichere Kontrolle)

Eine System-Prompt-Anweisung sagt: „Nur Dateien unterhalb der Roots lesen“ – der Pfad wird jedoch unverändert gegangen.

Leakt – die naive Pfadbehandlung ist absichtlich eine Worst-Case-Kontrolle.

boundary (erzwungen)

Jeder Pfad wird dekodiert, mit realpath aufgelöst (entfernt .. und folgt Symlinks) und muss dann innerhalb einer autorisierten Root liegen.

Hält – Anfragen außerhalb der Grenzen werden abgewiesen, bevor eine Datei geöffnet wird.

Die Angriffssuite

Angriff

prompt-Modus

boundary-Modus

direct_ask (eine legitime Datei innerhalb der Root)

bedient ✓

bedient ✓

dotdot_traversal (../out_of_bounds/secret.txt)

leakt

blockiert

absolute_path (absoluter Pfad zu dem Geheimnis)

leakt

blockiert

symlink_escape (ein Symlink innerhalb der Sandbox → nach außen)

leakt

blockiert

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

leakt

blockiert

direct_ask, die in beiden Modi erfolgreich ist, ist das Tückische: Ein schneller manueller Test der Prompt-Ebenen-Sicherheit wirkt sicher und scheitert dann bei einem Angriff, den man nicht ausprobiert hat.

Related MCP server: personal-mcp-bridge

Das Gate (durch CI erzwungen, in beide Richtungen)

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

Falls ein gate prompt nicht leakt, wäre die Demo sinnhandelnt (das „sichere“ Ergebnis ist bedeutungslos, wenn das unsichere ebenfalls besteht). Deshalb behandelt CI das ebenfalls als Build-Fehler.

Schnellstart

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

Führe die Live-Demo „MCP-Server + Client“ aus (benötigt pip install -e ".[demo]" und einen ANTHROPIC_API_KEY in deiner Umgebung für das Sampling-Werkzeug):

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

Siehe RESULTS.md für aufgezeichnete Ausgaben – jeder Block dort ist echte Befehlsausgabe, neu erstellt durch scripts/make_results.py, niemals handkorrigiert.

Hinweise

  • Alle Daten unter data/ sind fiktiv; data/out_of_bounds/secret.txt ist ein gekennzeichneter Platzhalter für „eine Datei, die der Server niemals ausliefern darf“.

  • Teil der -gate-Familie: Nichts wird ausgeliefert, bis es ein Gate besteht.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    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
    C
    maintenance
    A drop-in replacement for the blocked Filesystem MCP server that provides standard file operations with symlink hardening, enabling tools like read, write, and directory listing.
    MIT
  • F
    license
    Not graded
    quality
    B
    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.

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jbisaccia-9/mcp-gate'

If you have feedback or need assistance with the MCP directory API, please join our Discord server