keypaste — KeePass-совместимый менеджер паролей и секретов для работы с ИИ-агентами
📂 Исходный код на GitHubKeePass-совместимый менеджер паролей и секретов: локальное KDBX-хранилище, MCP-сервер с одобрением каждого запроса агента, запуск команд без .env и аудит с хеш-цепочкой.
keypaste
keypaste — менеджер паролей и секретов, совместимый с KeePass. Проект создан для тех, кто работает с ИИ-агентами. Все данные лежат в одном локальном файле KDBX на вашем диске: без аккаунта, без сети, без облака. Главный принцип проекта прост: агент получает секрет только тогда, когда человек лично разрешил выдачу.
Код открыт под лицензией AGPL-3.0. Опубликованная версия — CLI и MCP-сервер v0.3.0. Десктопное приложение существует в исходном коде, но публичного релиза у него ещё нет. Часть возможностей из документации появится только в версии 0.5.0 — README честно помечает каждое такое место.
Хранилище в формате KeePass
Файл хранилища — обычный KDBX 4. Его открывает и редактирует KeePassXC, а CI проекта на каждой значимой сборке проверяет совместимость в обе стороны с keepassxc-cli на Linux, macOS и Windows. keypaste не придумывает собственный формат и не пишет криптографию сам: слой формата — это встроенная в проект библиотека KeePassLib из KeePass 2.61, спрятанная за одним файлом-прослойкой.
Внутри — логины с заголовком, именем пользователя, паролем, адресом и заметками, разложенные по группам. Поиск идёт по заголовкам, именам и адресам и никогда не читает сами пароли. Генератор создаёт пароли от 8 до 256 символов из алфавита без знаков, опасных для shell, YAML и URL, либо парольные фразы из списка EFF. Есть история всех изменений с откатом в один шаг и шифрованные резервные копии рядом с хранилищем. Команда keypaste import переносит данные из другого KDBX-файла или продолжает работать с ним на месте.
Зашифрованный файл можно возить любым привычным сервисом синхронизации: своего механизма слияния у keypaste нет.
Одобрение запросов от агента
Через MCP-сервер агент видит два инструмента. list_entry_names возвращает пути групп и имена записей — и никогда значения. request_credential запрашивает одно поле одной записи — вместе с объяснением, зачем оно агенту. Запрос прилетает в терминал, где вы сами запустили keypaste agent: эта команда разблокирует хранилище и показывает подтверждения.
keypaste: an agent is asking for a credential.
agent claude-code (claude-code)
item env/demo/.env
field STRIPE_KEY
the agent says it needs this because:
deploy the billing service to staging
That sentence was written by the agent, not by keypaste. Treat it as a claim.
[d] deny [o] once [h] 1 hour
Здесь важна каждая деталь. keypaste прямо предупреждает: объяснение написано агентом, и воспринимать его стоит как утверждение, а не как факт. Варианты ответа — отказ, разрешение один раз или на час. Молчание в течение 45 секунд тоже означает отказ. Явный отказ сообщает агенту, что повторять запрос бессмысленно.
Мастер-пароль вводится только в keypaste agent — команде, которую запускаете вы сами. Агент не может вызвать запрос пароля, поэтому локальная программа-имитатор не сможет подделать привычное окно ввода.
Проекты и переменные окружения
Отдельная подсистема заменяет файлы .env. Переменные живут в хранилище в ветке env/<project>, у каждого проекта — свои наборы значений для dev, staging и prod, а prod всегда требует живого подтверждения. Импорт из существующего .env проходит с проверкой всего файла: при малейшей ошибке хранилище остаётся нетронутым.
Парсер понимает префиксы export, комментарии, три стиля кавычек и многострочные значения. Символ # начинает комментарий только после пробела, поэтому значение hunter2#42 сохраняется целиком. Дубликаты ключей считаются ошибкой, а конструкции ${VAR} не подставляются, чтобы не привязывать хранилище к окружению конкретной машины.
Экспорт в открытый текст требует явного шага: keypaste предупреждает о записи файла, отказывается перезаписывать само хранилище даже с флагом --force и создаёт файлы, читаемые только владельцем. Есть альтернатива без значений: файл .env.keypaste содержит ссылки вида KEY=kp://project/profile/KEY и ничего больше. Такой файл можно спокойно коммитить — значения подставляются в момент запуска. В исходном коде уже готова и пара других инструментов для командной работы: ограниченные по правам и сроку токены для CI и разовые ссылки для передачи одного секрета.
Запуск команд без .env
Команда keypaste run кладёт переменные проекта в окружение дочернего процесса — и только туда. Ничего на диск не пишется:
keypaste init ~/vault.kdbx
export KEYPASTE_VAULT=~/vault.kdbx
keypaste env pull dev
keypaste run dev -- npm start
Разделитель -- обязателен: без него команду не отличить от имени проекта. Набор переменных внедряется целиком или не внедряется вовсе: испорченное имя одной записи отменяет весь запуск, а в сообщении об ошибке перечисляются имена проблемных ключей, но не значения. Процесс получает снимок окружения на момент старта — последующие правки и блокировка хранилища на него не влияют.
Аудит и правила доступа
Каждый вызов агента — разрешённый, отклонённый и даже некорректный — попадает одной строкой в ~/.keypaste/audit.jsonl. Возвращённое значение в журнал не пишется. Каждая запись содержит хеш предыдущей, а keypaste log verify проверяет целостность цепочки — и честно перечисляет ограничения: полностью пересобранную цепочку или удаление записей с конца такая проверка не заметит.
В v0.3.0 заранее выданное разрешение описывается узкими правилами в файле ~/.keypaste/policy.toml. В версии 0.5.0 на смену им приходят настройки каждого агента прямо в хранилище: что ему видно, выдаются ли значения, может ли он запускать команды и в каком режиме он работает — спрашивать каждый раз, разрешать на срок или действовать автоматически с лимитом в час. Любое расширение прав требует подтверждения там, где хранилище разблокировано; сужение применяется сразу. Настройки хранятся в опубликованном формате ACAF v1, который смогут читать и другие KeePass-приложения.
Границы модели описаны без прикрас в THREATS.md: там разобраны подмена инструкций (prompt injection), неподлинные клиенты, усталость от бесконечных подтверждений, кешированные разрешения и подделка журнала. Истечение срока одобрения отменяет только кеш keypaste: копию значения у клиента и сам пароль в исходном сервисе это не отзывает.
Установка
Проект раздаёт нативные бинарники, которым не нужен установленный .NET: macOS на Apple Silicon, Linux на x64 и arm64, Windows на x64. Архив стоит проверять контрольной суммой. Сами бинарники пока не подписаны, и страница установки честно объясняет границу: checksum подтверждает целостность загрузки, но не подлинность издателя.
curl -fLO https://dl.keypaste.com/v0.3.0/keypaste-0.3.0-osx-arm64.tar.gz
curl -fLO https://dl.keypaste.com/v0.3.0/keypaste-0.3.0-osx-arm64.tar.gz.sha256
shasum -a 256 -c keypaste-0.3.0-osx-arm64.tar.gz.sha256
tar -xzf keypaste-0.3.0-osx-arm64.tar.gz
mkdir -p ~/.local/bin && mv keypaste keypaste-mcp ~/.local/bin/
Для Linux замените имя файла на linux-x64 или linux-arm64. Требования: macOS 14+, Linux с glibc 2.35, Windows 10 1809+. Для Intel-маков, musl-дистрибутивов вроде Alpine и Windows на ARM единственный путь — сборка из исходников через .NET SDK.
Подключение к Claude Code или Claude Desktop делается одной командой. Она находит установленные клиенты и прописывает конфигурацию через их механизм mcp add:
keypaste setup --vault ~/vault.kdbx
Мастер-пароль в конфигурацию клиента не попадает. Подробности о настройке и чтении аудита — в руководстве по подключению.
Статус проекта
Проект молодой и не скрывает этого. Опубликованный v0.3.0 помечен как pre-1.0: авторы прямо рекомендуют заменить v0.2.0 и v0.1.0, у которых были дефекты с потерей изменений при одновременном сохранении. Десктопного релиза нет. Часть документации описывает возможности будущей версии 0.5.0, и на каждой такой позиции стоит пометка. При этом качество сборки поддерживается всерьёз: тесты прогоняют реальные процессы CLI и MCP, а совместимость с KeePassXC — постоянное условие слияния изменений, а не разовая проверка.
Сообщения об уязвимостях принимаются по почте, а не через открытый трекер — процедура описана в SECURITY.md.
Источник: https://github.com/notinferred/keypaste