Skip to main content
Glama
jbisaccia-9

mcp-gate

by jbisaccia-9

mcp-gate

ci

Путь — это запрос. Граница корневых каталогов — это гарантия.

MCP-сервер доступа к файлам определяет, к каким файлам модель может обращаться, через roots — набор разрешённых каталогов. mcp-gate демонстрирует разницу между указанием серверу оставаться внутри своих корневых каталогов и принудительным её соблюдением: один и тот же набор атак запускается против версии, где есть только инструкция, и против версии, которая канонизирует каждый путь и проверяет его по границе перед любым чтением. Одна версия даёт утечку; вторая держит удар. Обе стороны проверяются в CI.

Это независимая реализация концепций из публичных материалов Anthropic по MCP, написанная для наглядной демонстрации трёх вещей:

Возможность

Где проявляется

Продвинутый MCP-сервер

src/mcp_gate/server.py — сервер на FastMCP, предоставляющий типизированные инструменты (list_roots, read_file, list_dir, summarize_file), со структурированными ошибками и инициируемым сервером сэмплированием (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-кодированный обход нормализуются до проверки корневого каталога. Это и есть гейт.

Два режима

Режим

Как принимается решение

Результат

prompt (небезопасный контроль)

В системном промпте сказано: «читай только файлы внутри корневых каталогов», но путь открывается как есть.

Утечка — наивный обработчик путей намеренно служит наихудшим контрольным случаем.

boundary (принудительный)

Каждый путь декодируется, разрешается через realpath (схлопывая .. и следуя за символическими ссылками), после чего обязан находиться внутри авторизованного корневого каталога.

Держит — запросы за пределами границ отклоняются до открытия любого файла.

Набор атак

Атака

режим prompt

режим boundary

direct_ask (легитимный файл внутри корня)

выдаётся ✓

выдаётся ✓

dotdot_traversal (../out_of_bounds/secret.txt)

утечка

заблокировано

absolute_path (абсолютный путь до секрета)

утечка

заблокировано

symlink_escape (символическая ссылка внутри песочницы → наружу)

утечка

заблокировано

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

утечка

заблокировано

Успешное выполнение direct_read в обоих режимах — обманчивая часть: быстрый ручной тест безопасности уровня промпта выглядит безопасным, но затем он падает под атакой, которую вы не пробовали.

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: ничего не публикуется, пока не пройдёт через гейт.

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