Безопасность и видимость
Дать агенту прямой доступ к движку хранения — значит собрать «lethal trifecta»: приватные данные × недоверенный контент заметок × исходящий канал. Любая из осей сама по себе безобидна, но вместе они позволяют инъекции в заметке увести ваши данные наружу. MCP-гейтвей Notarium разрывает каждую ось конструкцией, а не настройкой. Это не обёртка ради удобства — это граница доверия.
Трифекта разорвана конструкцией
- Нет исходящего канала. У всех инструментов выставлен
openWorldHint:false— ни один инструмент не ходит в сеть. Нет переноса или копирования между пространствами — внутренняя утечка данных тоже закрыта. Уводить данные некуда. - Недоверенный контент обезврежен. Инструкции сервера статичны и никогда не смешиваются с содержимым заметок: контент не подмешивается ни в описания инструментов, ни в server
instructions. Так инъекция в теле заметки не станет командой агенту. - Деструктив только обратимый.
delete_noteшлёт заметку в корзину; восстановление и безвозвратную очистку делает человек, не агент. Это и есть линия «агент не делает необратимого».
Проверка прав на каждом вызове
Права проверяются дважды. Сначала tools/list фильтруется потолком токена — read-токен просто не видит пишущие инструменты. Затем каждый tools/call дополнительно проверяет доступ к конкретному пространству (can(principal, action, {space})). Формула прав — effective = scopes(token) ∩ grants(principal): права токена (потолок действий) пересекаются с живым членством в пространствах. Отзыв гранта сужает токен мгновенно.
Management-действия (выпуск токенов, управление членами) лежат выше write — утёкший токен уровня write не выпустит новый токен и не выдаст доступ.
Отказ = 404, не 403
Отказ в доступе отдаётся как 404 («нет такого»), а не 403 («нельзя»). Так по кодам ответа нельзя перебором выяснить, какие заметки или пространства существуют за пределами выданных прав. Чужое пространство недостижимо в принципе и неотличимо от несуществующего.
flowchart TD
call[tools/call] --> listed{инструмент в<br/>потолке токена?}
listed -->|нет| gone[инструмента нет в tools/list]
listed -->|да| acl{can principal,<br/>action, space?}
acl -->|нет| notfound[404 · анти-enumeration]
acl -->|да| exec[выполнить · провенанс в журнал]
Обезвреживание недоверенного контента
Всё, что уходит агенту — title, snippet, content, frontmatter — очищается перед отправкой: у псевдо-control-тегов (<system>, <instructions> и подобных) обезвреживаются угловые скобки. Заметка, в которую кто-то вписал «системную инструкцию», приедет агенту как обычный текст, а не как команда.
История правок видна
Каждая правка записывает в историю правок, кто её сделал — конкретный человек или агент. get_note и recall умеют вернуть, кто правил заметку: человек или агент, какой именно. Инъекция, прошедшая через агента, остаётся видимой и отслеживаемой.
Даже полностью скомпрометированный промптом агент ограничен своим токеном: он не выйдет в сеть, не дотянется до чужого пространства, не сделает необратимого удаления и не выдаст себе прав. Худшее, что он может, — обратимая правка в пределах своих прав, с полным провенансом в журнале.
Граница: не E2EE
Notarium осознанно не делает сквозного шифрования. Умный сервер — поиск, семантика, история, агенты — требует доступа к plaintext. Приватность здесь строится на self-host и владении файлами, а не на E2EE. Модель угроз гейтвея защищает от компрометации агента, а не от компрометации хоста, которому вы и так доверяете свои файлы.
Дальше
- Подключение агента — токены, права и OAuth-фасад.
- Аудит извлечения — наблюдаемость того, что агент искал.
- Интент-инструменты — почему набор именно такой.