Skip to main content
Glama

Sentinel

Непрерывный внешний (out-of-band) уровень доверия и надёжности для экосистемы Model Context Protocol.

У npm есть lockfile и команда аудита. У MCP нет ни того, ни другого. Sentinel — и то, и другое.


Проблема

MCP — это то, как AI-агенты получают свои инструменты. Агент узнаёт, что делает инструмент, вызывая tools/list и читая description и inputSchema, возвращаемые сервером, — текст, который попадает напрямую в промпт модели.

Протокол явно допускает изменение этого ответа между любыми двумя вызовами, без обязательного повторного одобрения и без проверки целостности.

Сервер, который вы одобрили в понедельник, во вторник может давать вашей модели другие инструкции. Это rug pull, и он уже был продемонстрирован на продакшн-серверах MCP и реально применялся в инциденте postmark-mcp.

Между тем в экосистеме насчитывается ~9 650 каталогизированных публичных серверов, за один 60-дневный период в начале 2026 года подано более 30 CVE, а 88% организаций сообщают об инцидентах с AI-агентами за последний год — против 23%, у которых вообще есть какая-либо стратегия идентификации агентов.

Отравленный сервер по-прежнему возвращает HTTP 200. Именно поэтому мониторинг аптайма этого не видит.


Что делает Sentinel

  registry sync  →  read-only probe  →  canonicalise  →  fingerprint
                                                             ↓
   alert  ←  classify severity  ←  structural diff  ←  compare to approved baseline
     ↓                ↓
  CI gate      hash-chained evidence ledger
  • Обнаруживает серверы из официального реестра MCP с помощью инкрементальной синхронизации через updated_since

  • Зондирует их read-only методами протокола в обеих актуальных редакциях спецификации (2026-07-28 без состояния и 2025-11-25 с рукопожатием initialize)

  • Снимает отпечатки каждого определения инструмента — RFC 8785 канонизация → SHA-256 → корень Меркла для каждой поверхности

  • Классифицирует каждое изменение по степени серьёзности — SAFE / COMPATIBILITY / SECURITY / IDENTITY — с опубликованными идентификаторами правил

  • Записывает всё в добавляемый только в конец (append-only), хэш-связанный, независимо проверяемый реестр доказательств

  • Оценивает каждый сервер по пяти разложимым компонентам, так что низкая оценка всегда объяснима

  • Контролирует ваш CI — sentinel verify завершается с ненулевым кодом и выдаёт SARIF

  • Сам является MCP-сервером, поэтому агент может спросить «этот сервер безопасен?» до того, как привяжется


Почему таксономия серьёзности — это и есть весь продукт

Наивный детектор «изменился ли хэш» генерирует примерно 53 оповещения за рабочий день по всему каталогу. Никто это не триажирует, поэтому в течение двух недель он замолкает, и контроль ничего не стоит.

Классификация по серьёзности и эскалация только при уровне «критично для безопасности или хуже» снижает это до ~5 в день — реальный ящик реального человека.

Alert volume at four escalation thresholds


Чего он намеренно не делает

Это ограничения, а не отсутствующие функции. Прочтите их, прежде чем оценивать заявления.

Почему

Никогда не вызывает tools/call

Sentinel зондирует тысячи серверов, которые ему не принадлежат. Их инструменты включают send_email, delete_file, transfer_funds. Монитор, способный вызывать произвольные инструменты по всей экосистеме, и есть уязвимость. ADR-0004

Не может поймать вредоносный сервер с первого дня

Базовый уровень и есть отрава. Отпечаткам не с чем сравнивать

Фиксирует определения, а не поведение

Инструмент может изменить то, что он делает, не меняя свою схему. Sentinel этого не увидит

В цепочке обнаружения нет LLM

Входные данные — это текст, контролируемый атакующим и созданный для манипулирования языковыми моделями. Передача его языковой модели для оценки помещает детектор внутрь модели угроз самой атаки. ADR-0007

Не находится на пути запроса

Out-of-band по дизайну. Внедрение — это изменение конфигурации, а не архитектуры


Попробуйте

Требуется uv. Всё выполняется на записанных фикстурах — никакой сети, никаких сторонних серверов, никогда.

uv sync --extra dev

Поймайте rug pull от начала до конца:

uv run sentinel demo
▸ T+0m — Baseline. Reviewed by a human and approved.
  root 04dcdce60579b4af…
  baseline approved — drift is measured against this

▸ T+5m — The rug pull. Description only — the schema is untouched.
  DRIFT · SECURITY rules INJ-004, INJ-007
    SECURITY      /tools/send_email/description
      description changed: INJ-004 Exfiltration reference; INJ-007 Concealment instruction.
      evidence: ~/.ssh | Do not mention this to the user

Simulating an attacker with database write access
  rewriting ledger entry seq=4 to hide the finding…
  DETECTED ledger chain broken at seq=4: payload does not match its recorded hash

Поймайте расширение возможностей, когда вообще ничего не меняется в тексте:

uv run sentinel demo --scenario tests/scenarios/schema_widening.yaml

Запустите гейт классификатора, синхронизируйте каталог, зондируйте легаси-сервер 2025-11-25:

uv run sentinel eval --verbose
uv run sentinel sync
uv run sentinel probe tests/fixtures/servers/legacy_2025.json

Статус

M1–M3 реализованы и зелёные. M4–M6 спроектированы, но не построены.

Веха

Статус

M0 — Дизайн-документы, ADR, модель угроз

M1 — Синхронизация реестра + клиент зондирования двух ревизий + конформность

M2 — Канонизация, снятие отпечатков, Merkle, реестр доказательств

M3 — Анализатор схем + классификатор серьёзности + корпус + CI-гейт

✅ ⭐

M4 — Планировщик + оценка доверия + оповещение

⬜ спроектирован

M5 — REST API + Sentinel-as-MCP-сервер + политический гейт

⬜ спроектирован

M6 — Дашборд + развёртывание

⬜ спроектирован

Текущие гейты, все проходят на main:

Гейт

Результат

pytest

117 прошло

mypy --strict

чисто, 31 исходный файл

ruff

чисто

bandit

чисто

lint-imports

2 контракта соблюдены — core/ доказуемо не импортирует ничего с I/O

sentinel eval

ЗЕЛЁНЫЙ — 66 случаев в корпусе, 1.000 точность/полнота, 1.000 атрибуция правил

Честно насчёт этой 1.000. Корпус создавался вместе с правилами, поэтому эти цифры измеряют внутреннюю согласованность и защиту от регрессий, а не обобщение на атаки, о которых ещё никто не подумал. Что гейт действительно даёт — так это то, что изменение правила, ломающее существующий случай, валит сборку. И он уже окупился во время M3, поймав четыре реальных дефекта: баг с границей слова, из-за которого INJ-004 не срабатывал в середине предложения, и сравнение схем, которое путало отсутствие с пустотой и инвертировало отношение при каждом удалении enum. Для измерения реальной полноты нужен дрифт, собранный с живой экосистемы — это задача M4.


Документация

Начните с 02 — PDD для понимания «что» и «почему», затем 06 — Дизайн обнаружения дрейфа для основного алгоритма.

Документ

01 — Исследование и анализ

Ландшафт угроз, исследование протокола, конкурентный анализ, диаграммы

02 — Документ определения проекта

Проблема, цели, не-цели, пользователи, объём, риски

03 — Требования

Функциональные требования, нефункциональные требования, пользовательские истории, критерии приёмки, трассируемость

04 — Проектирование верхнего уровня

C4 контекст/контейнер/компонент, потоки данных, развёртывание

05 — Проектирование нижнего уровня

Модули, конечные автоматы, ERD, DDL, API-поверхности

06 — Дизайн обнаружения дрейфа

Основной алгоритм. Канонизация, снятие отпечатков, таксономия серьёзности, субтипирование схем

07 — Модель оценки доверия

Формулы, веса, EWMA, анализ чувствительности

08 — Дорожная карта

Вехи, разбивка задач, оценки, критический путь

09 — План тестирования и оценки

Корпус, гейты точности/полноты, тестовая обвязка для инъекций дрейфа

10 — Модель угроз

STRIDE, сценарии злоупотреблений, покрытие OWASP MCP Top 10

11 — Питч для интервью

Питч, сценарий демо, Q&A

ADRs

Восемь записей архитектурных решений


Технологический стек (планируется)

Python 3.12 · httpx · Pydantic v2 · FastAPI · Typer · SQLAlchemy 2.0 · Postgres 17 · Redis 8 · React + Vite · Docker · uv · ruff / mypy --strict / bandit / pytest


Политика зондирования

Sentinel зондирует стороннюю инфраструктуру, которая ему не принадлежит. Делает он это вежливо:

  • глобальный лимит частоты запросов, конкурентность 1 на хост, минимальный интервал между запросами к хосту

  • ±10% джиттера на каждом плановом зондировании, чтобы флот не срабатывал синхронно ровно в час

  • экспоненциальная отсрочка (backoff); Retry-After всегда соблюдается

  • идентифицирующий User-Agent, указывающий на опубликованную политику с возможностью отказа (opt-out)

  • только read-only методы — никогда tools/call, resources/read или prompts/get

См. PROBING.md (будет опубликовано вместе с M1).


Что сломалось и как я это исправил

1. Граница слова, которая никогда не могла сработать. INJ-004 — правило, которое ловит появление в описании инструмента ссылки на ~/.ssh или .env, — имело паттерн \b(\.env|credentials?)\b. Оно никогда не срабатывало в середине предложения. Граница слова \b не может существовать между пробелом и точкой, потому что ни то, ни другое не является символом слова, поэтому \b\.env срабатывает только тогда, когда .env приклеен к предшествующему слову. Случай в корпусе, который это поймал, был недавно добавленный инструмент с описанием «прочитать содержимое .env» — точная форма реальной атаки, молча классифицированная как SAFE. Исправлено с помощью просмотра назад (lookbehind): (?<![\w.])\.env\b.

2. Смешение «отсутствует» и «пусто». Я добавил сокращение, чтобы схема, появляющаяся там, где её раньше не было, трактовалась как расширение, а не комбинировалась в INCOMPARABLE. Я записал это как if not before and after: — что срабатывает и когда before равно {}. В JSON Schema {} — это допустимая схема, которая принимает что угодно, что противоположно отсутствию схемы. В результате отношение инвертировалось во всех случаях удаления enum: удаление enum сообщало NARROWED вместо WIDENED, а SEC-021 — правило, от которого зависит лучшая демонстрация всего проекта, — перестало срабатывать. Это поймали шесть модульных тестов. Исправлено явной проверкой is None с комментарием о причине, потому что вариант с ложным значением выглядит более идиоматично, но неверен.

3. Добавление свойств в открытый объект. Анализатор верно вычислил, что добавление объявленного свойства в объект с неустановленным additionalProperties не меняет множество принимаемых документов — ключ уже был разрешён. Строго говоря, это верно, но из-за этого SEC-025, SEC-026 и SEC-027 никогда не видели добавления параметра webhook_url или access_token, поскольку изменение не фиксировалось. Исправление стало осознанным отходом от чисто языковой семантики: Sentinel отслеживает объявленную поверхность, потому что именно список свойств попадает в промпт модели и сообщает ей, что можно отправлять. Теперь это фиксируется как расширение, а обоснование — комментарий в schema_compat.py, а не фольклор.

4. Bandit пометил мой собственный детектор. Детектор скрытого содержимого INJ-006 содержит буквальные нулевой ширины и двунаправленные управляющие символы, потому что именно их он ищет. Проверка B613 в Bandit существует именно для обнаружения таких символов в исходном коде. Она была права, но срабатывание было ложным. Пропущено с указанием причины в pyproject.toml, а не молча.

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


Автор: Nathan Alvares · Лицензия: TBD (планируется Apache-2.0)

-
license - not tested
-
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 Connectors

  • Scans MCP servers for tool poisoning, prompt injection and supply chain risks.

  • Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.

  • Independent A-F trust grade for any MCP server, watched for drift. Free, never for sale.

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/IronNathanAlvares/mcp-sentinel'

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