Veil
Veil
ИИ-агент может организовать размещение учётных данных, никогда не получая их значения, в то время как доверенный интерфейс, управляемый человеком, независимо авторизует, куда эти данные могут быть отправлены.
В этом предложении заключается вся суть. Veil — это MCP-сервер и защищённый брокер ввода: агент говорит «помести ключ Stripe production в Google Secret Manager», человек видит, в какой именно проект и секрет будет произведена запись, и вводит значение в собственное окно Veil, а значение отправляется напрямую в место назначения. Модель никогда его не получает.
Реализовано в соответствии с SPEC.md.
Что решает Veil
Veil устраняет целый класс сбоев, вызванных тем, что агент знает секрет. При использовании Veil учётные данные не проходят через:
подсказки LLM или историю диалога;
аргументы инструментов MCP или результаты их работы;
память агента или сгенерированный код;
аргументы команд оболочки или argv процесса;
журналы, отладочные трассировки или телеметрию;
URL-адреса;
вывод команд, видимый модели.
Что Veil не решает
Veil не делает ИИ-агента надёжным и не является «безопасным ИИ». Он не гарантирует, что агент выбрал правильное место назначения, что он вас понял, что он защищён от инъекций подсказок, что само место назначения безопасно, что ваша машина не скомпрометирована или что учётные данные не будут использованы не по назначению программным обеспечением, которое их легитимно получит.
Здесь две отдельные проблемы:
Вопрос | Ответ Veil |
Должен ли агент знать секрет? | Нет. |
Должен ли агент единолично решать, куда отправить секрет? | Нет, без авторизации человека. |
Veil отвечает на эти два вопроса. Он не претендует на решение остальных.
Модель доверия
Trusted with the credential value:
The human at the keyboard
Veil's secure input UI (loopback only, in your control)
Veil's secure input broker (this process)
The selected destination adapter
The destination provider (e.g. Google Secret Manager)
NOT trusted with the credential value:
The LLM
The agent / MCP client
The conversation
The prompt and any repository content it read
Generated code
Logs, telemetry, crash reportsЭта диаграмма не утверждает, что доверенные компоненты неуязвимы. Она показывает, где учётным данным разрешено находиться. Veil — это программное обеспечение, чувствительное к безопасности: если сам Veil вредоносен или скомпрометирован, граница исчезает. Его исходный код, зависимости и релизы заслуживают той же проверки, которую вы бы применили к любому инструменту для работы с учётными данными.
Два потока
Поток секрета — путь человека, который модель не может наблюдать:
Human ─▶ Veil secure UI (127.0.0.1) ─▶ Broker ─▶ Adapter ─▶ DestinationПоток агента — всё, что видит модель:
LLM ─▶ MCP client ─▶ Veil MCP server ─▶ non-sensitive result metadataСхема инструмента MCP не содержит свойства, способного передавать учётные данные. Это структурное ограничение, а не инструкция в подсказке: нет поля value, secret_value, password, token, content или raw_secret, которое можно было бы использовать; закрытые схемы отклоняют неизвестные свойства, а аргументы проверяются на наличие значений, похожих на учётные данные, до их разбора.
Что вызывает агент
{
"destination": "gcp-secret-manager",
"name": "STRIPE_SECRET_KEY",
"target": { "project": "my-production-project", "secret": "STRIPE_SECRET_KEY" },
"write_mode": "new-version",
"environment": "production",
"description": "Stripe production API key"
}Veil отвечает request_id, классификацией риска и нормализованным местом назначения — и открывает собственное окно авторизации на вашей машине. Агент опрашивает secret.status.
Агент не получает ссылку для авторизации. Эта ссылка — возможность: любой, кто ею владеет, может завершить человеческую часть потока, а агент с оболочкой или HTTP-инструментом — это именно та модель угроз. Veil передаёт ссылку вашему браузеру и выводит её в собственную консоль. Установите VEIL_DISCLOSE_AUTHORIZATION_URL=true, если ваша конфигурация требует, чтобы агент передавал ссылку (например, для удалённой или безголовой сессии), — и понимайте, что это позволяет скомпрометированному агенту авторизовать собственный запрос.
Инструмент | Назначение |
| Создать запрос на учётные данные. Возвращает нечувствительные метаданные и идентификатор запроса. |
| Опрашивать запрос. Никогда не возвращает учётные данные. |
| Отменить ожидающий запрос; любое введённое значение уничтожается. |
| Аннулировать авторизацию и начать новую. Ничего не редактируется на месте. |
| Список мест назначения и ожидаемых целевых полей. |
Что видит человек
Этап A показывает имя учётных данных, провайдера места назначения, проект/аккаунт, ресурс, операцию и риск до ввода значения. Операции высокого риска (перезапись в production, хранение в открытом виде, базы данных приложений, замена учётных данных) требуют второго подтверждения на этапе B, после ввода и перед записью. Значение никогда не отображается повторно.
Страница, которую читает человек, и операция, которую выполняет исполнитель, — это один и тот же неизменяемый объект — нет отдельного «отображаемого места назначения». Любое изменение места назначения, проекта, имени секрета, операции, режима записи или адаптера аннулирует авторизацию и требует новой.
Поддерживаемые адаптеры
Адаптер | Класс | Примечания |
|
| Предпочтительный. Требует |
|
| С ограничением по пути, отказом от символических ссылок, атомарной записью с правами |
|
| Требует |
Места назначения arbitrary-network (универсальные HTTP POST, вебхуки) не реализованы, и реестр адаптеров отказывается их регистрировать.
Допущения и ограничения безопасности
Сказано прямо, потому что инструмент безопасности, который себя переоценивает, хуже, чем его отсутствие:
Процесс брокера видит секрет. В этом и смысл: что-то должно его видеть, иначе сохранение невозможно. Гарантия в том, что это делают только минимальные доверенные компоненты транспорта и назначения.
CPython не может надёжно стирать память.
SecretBufferзатирает изменяемый буфер, которым владеет, но процентное декодирование, преобразованияstr/bytesи SDK провайдеров создают неизменяемые копии, которые интерпретатор может хранить до сборки мусора. Veil минимизирует это и не даёт ложных гарантий.Интерфейс — это loopback HTTP. Любой процесс, работающий от вашего имени на вашей машине, может до него добраться, и любой такой процесс также может его имитировать. Каждый процесс Veil выводит случайную идентификационную фразу, которую отображают его страницы (помощь против подделки, а не криптографический контроль). Сокрытие ссылки от агента повышает планку, но не останавливает процесс, который может читать вывод консоли Veil, просматривать argv браузера или сканировать loopback-порты.
Veil не проверяет место назначения. Если вы авторизуете запись учётных данных в документ Firestore, Veil записывает их туда и сообщает, что это плохая идея; он не препятствует этому.
Предварительная проверка — с максимальными усилиями. Если провайдер недоступен во время предварительной проверки, он сообщается как недоступный, а не угадывается.
Семантика сбоев. Сбой между записью провайдера и ответом может оставить учётные данные записанными без локальной записи об успехе. Veil сообщает о запросе как о неудачном; источником истины является место назначения.
Локальная разработка
uv venv
uv pip install -e ".[dev]"
# run the server the way an MCP client would
uv run veil serve
# with optional providers
uv pip install -e ".[dev,gcp,firestore]"Конфигурация читается из собственного окружения Veil — никогда из аргументов инструмента:
Переменная | По умолчанию | Значение |
|
| Срок действия запроса. |
|
| Верхняя граница времени одной записи в место назначения. |
|
| Требовать подтверждение для операций среднего риска. |
|
| Безопасный адрес привязки интерфейса. |
|
| Автоматически открывать окно авторизации. |
|
| Возвращать ссылку авторизации агенту. |
| текущая директория | Корневые директории, внутри которых адаптер |
|
| Разрешить запись в env-файл, отслеживаемый Git. |
| все | Разрешённый список через запятую. |
Конфигурация MCP-клиента
{
"mcpServers": {
"veil": { "command": "uv", "args": ["run", "veil", "serve"] }
}
}Тесты
uv run pytest # everything
uv run pytest tests/security # the adversarial suite only
uv run ruff check .
uv run mypyНабор тестов безопасности — это требование продукта, а не приятное дополнение. Он включает обнаружение утечек-канареек по каждому наблюдаемому каналу, тесты вредоносного агента, фикстуры для инъекций подсказок, тесты TOCTOU и повторного воспроизведения, 100-поточный стресс-тест, состояния гонки, пути сбоев, симуляцию отказа провайдера, проверки интерфейса и фаззинг. Релиз блокируется, если происходит любая утечка канарейки, любая успешная обходная авторизация, любая успешная мутация после утверждения, любой завершённый запрос может быть воспроизведён повторно, любой секрет пересекает границу запроса, любая ошибка провайдера в сыром виде достигает MCP или любая операция высокого риска пропускает подтверждение.
См. docs/SECURITY_MODEL.md для карты инвариантов и тестов.
Статус проекта
Версия 0.1.0, создана в соответствии с SPEC.md, который остаётся в репозитории как авторитетное описание предполагаемого поведения. Каждый существенный модуль и тест ссылается на реализуемый раздел, чтобы рецензент мог проверить код на соответствие требованию, а не его краткому изложению.
MVP завершён, и полный набор тестов — включая состязательный — проходит. Что остаётся, прежде чем кто-либо сможет положиться на него в реальной работе: независимая проверка, тестирование человеческого фактора интерфейса подтверждения (SPEC.md §35) и подписанные артефакты релиза (§43).
Участие в разработке
Безопасность здесь — это продукт, поэтому требования к изменениям скорее конкретны, чем бюрократичны:
Изменение, затрагивающее обработку учётных данных, авторизацию или поверхность MCP, требует теста, который пытается нарушить затрагиваемый инвариант, а не только показывает его работоспособность.
Никогда не ослабляйте тест безопасности, чтобы пройти набор. Если тест выявляет архитектурный недостаток, меняется архитектура.
Новые зависимости времени выполнения в ядре по умолчанию отклоняются. Брокер — это доверенная вычислительная база для учётных данных; SDK провайдеров относятся к опциональному расширению.
Запустите
ruff check .,ruff format --check .,mypyиpytestперед открытием pull request.
Нашли уязвимость? Пожалуйста, сообщите о ней конфиденциально через систему безопасности GitHub, а не через публичное обращение.
Лицензия
Apache License 2.0 © 2026 Eduardo Rosostolato.
This server cannot be installed
Maintenance
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
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP-native Trust Infrastructure for AI Agents. Persistent encrypted memory with Trust Quotient.
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/rosostolato/veil-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server