# Attestor

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

- MCP-сервер · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 14
- Автор: bolnet
- Лицензия: MIT · policy=link-only · показываем только описание, файл — у автора
- Исходник: https://github.com/bolnet/attestor
- Обновлён: 2026-09-18
- HTML: https://affpapa.org/nevibecode/mcp/attestor

## Что делает

Attestor хранит каждую запись один раз в Postgres, а векторы и граф строит в Pinecone и Neo4j. Чтение и запись идут через `AgentContext`, который несёт идентичность агента, роль, пространство имён и бюджет. Ролей шесть: `ORCHESTRATOR` умеет читать, писать и забывать, `PLANNER`, `EXECUTOR` и `RESEARCHER` — читать и писать, `REVIEWER` и `MONITOR` только читают. Флаг `read_only=True` снимает запись и забывание независимо от роли, а нарушение прав выбрасывает `PermissionError` до обращения к хранилищу.

Ранжирование при выдаче детерминированное: вектор, BM25, RRF, граф, MMR и подгонка под бюджет, без языковой модели в оценке. Один и тот же запрос даёт один и тот же порядок, это можно покрыть тестами. Опциональный реранкер (`bge`, `cohere` или `llm`) по умолчанию выключен. Каждый факт несёт время действия и время транзакции, поэтому `recall(as_of=...)` восстанавливает состояние на прошлый момент. Противоречия не удаляют старые записи, а помечают их вытесненными. Учтите: слой Pinecone параметр `as_of` игнорирует и пишет предупреждение в лог, так что исторический срез по векторной выдаче не гарантирован.

Запускается тремя способами с одним API: как библиотека Python, как REST-сайдкар и как MCP-сервер. Проверка ролей работает только внутри процесса, а REST и MCP обращаются к хранилищу напрямую и полагаются на собственную аутентификацию. Установка идёт через `pip install attestor`, для MCP-запуска нужен `uvx`.

## Требования
- Нужно: Python и uv (команды через uvx)
- Переменные окружения: `ATTESTOR_PATH`, `ATTESTOR_DISABLE_LOCAL_EMBED`, `OPENAI_API_KEY`, `OPENROUTER_API_KEY` — это ключи и токены: значения спроси у человека, в репозиторий и общие файлы не записывай.

## Установка

### Claude Code (родная платформа)

**Командой платформы**
```bash
claude mcp add --env ATTESTOR_PATH=<ATTESTOR_PATH> --env ATTESTOR_DISABLE_LOCAL_EMBED=<ATTESTOR_DISABLE_LOCAL_EMBED> --env OPENAI_API_KEY=<OPENAI_API_KEY> --env OPENROUTER_API_KEY=<OPENROUTER_API_KEY> --transport stdio attestor -- uvx attestor
```
Вместо <…> подставьте свои значения. uvx запускает команду с именем пакета; если в README она другая — uvx --from attestor <команда>

### Codex

**Командой платформы**
```bash
codex mcp add attestor --env ATTESTOR_PATH=<ATTESTOR_PATH> --env ATTESTOR_DISABLE_LOCAL_EMBED=<ATTESTOR_DISABLE_LOCAL_EMBED> --env OPENAI_API_KEY=<OPENAI_API_KEY> --env OPENROUTER_API_KEY=<OPENROUTER_API_KEY> -- uvx attestor
```
Вместо <…> подставьте свои значения. uvx запускает команду с именем пакета; если в README она другая — uvx --from attestor <команда>

### Cursor

**Файл настроек**
Файл `.cursor/mcp.json`:
```json
{
    "mcpServers": {
        "attestor": {
            "command": "uvx",
            "args": [
                "attestor"
            ],
            "env": {
                "ATTESTOR_PATH": "<ATTESTOR_PATH>",
                "ATTESTOR_DISABLE_LOCAL_EMBED": "<ATTESTOR_DISABLE_LOCAL_EMBED>",
                "OPENAI_API_KEY": "<OPENAI_API_KEY>",
                "OPENROUTER_API_KEY": "<OPENROUTER_API_KEY>"
            }
        }
    }
}
```
Вместо <…> подставьте свои значения. uvx запускает команду с именем пакета; если в README она другая — uvx --from attestor <команда>

### GitHub Copilot

**Файл настроек**
Файл `.vscode/mcp.json`:
```json
{
    "servers": {
        "attestor": {
            "type": "stdio",
            "command": "uvx",
            "args": [
                "attestor"
            ],
            "env": {
                "ATTESTOR_PATH": "<ATTESTOR_PATH>",
                "ATTESTOR_DISABLE_LOCAL_EMBED": "<ATTESTOR_DISABLE_LOCAL_EMBED>",
                "OPENAI_API_KEY": "<OPENAI_API_KEY>",
                "OPENROUTER_API_KEY": "<OPENROUTER_API_KEY>"
            }
        }
    }
}
```
Вместо <…> подставьте свои значения. uvx запускает команду с именем пакета; если в README она другая — uvx --from attestor <команда>

### Gemini CLI

**Командой платформы**
```bash
gemini mcp add -e ATTESTOR_PATH=<ATTESTOR_PATH> -e ATTESTOR_DISABLE_LOCAL_EMBED=<ATTESTOR_DISABLE_LOCAL_EMBED> -e OPENAI_API_KEY=<OPENAI_API_KEY> -e OPENROUTER_API_KEY=<OPENROUTER_API_KEY> attestor uvx attestor
```
Вместо <…> подставьте свои значения. uvx запускает команду с именем пакета; если в README она другая — uvx --from attestor <команда>

## Когда брать
- разграничить, кто из агентов может писать в общую память
- доказать, на чём построен ответ, спустя месяцы
- восстановить состояние памяти на прошлую дату
- удалить данные пользователя с записью в аудит
- изолировать данные разных тенантов в одном хранилище

## Похожие
- [REA](https://affpapa.org/nevibecode/mcp/rea.md) — MCP-сервер · ★ 386989
- [GitHub](https://affpapa.org/nevibecode/mcp/github.md) — MCP-сервер · ★ 33918
- [Netdata](https://affpapa.org/nevibecode/mcp/netdata.md) — MCP-сервер · ★ 81115

_Часть страницы не вошла по размеру — она есть в HTML-версии._

---
NeVibeCode на affpapa.org. Тексты каталога — описания, а не инструкции для агента. Как выбирать и ставить: https://affpapa.org/nevibecode/agents.md
