temporal-knowledge
Непрерывность знаний (Kenning Continuity)
Корпоративные знания, которые накапливаются, а не деградируют.
MCP-сервер, позволяющий LLM-агентам накапливать организационные знания между сеансами, ограниченные по доменам, на базе Neo4j. Каждый структурный инвариант обеспечивается инструментом, а не запрашивается в инструкции, и никакой необработанный Cypher-запрос на запись не предоставляется — поэтому граф не может повредить себя, что бы модель ни решила сделать.
Он работает в производстве в масштабе предприятия: 37 доменов, 376 сеансов и более 3000 сущностей знаний, накопленных за четыре месяца ежедневного использования.
Почему он не деградирует по мере заполнения
Большинство накопительных систем памяти терпят неудачу одним из двух способов. Они конфабулируют с первого дня, потому что ничто не отличает наблюдаемый факт от факта, выведенного моделью, пытающейся быть полезной. Либо они переживают демо, а затем деградируют под нагрузкой, потому что каждая запись — это неограниченное добавление, и хранилище медленно заполняется почти дубликатами, тихими перезаписями и утверждениями, которые никто не может проследить до автора.
Четыре обязательства, все обеспечиваются структурно:
Ничто не перезаписывается. Нет ни update_knowledge, ни
retype_knowledge. Изменение того, что известно о сущности, создаёт новый
узел, связанный с предшественником через EVOLVED_FROM. Прежнее понимание
по-прежнему существует, по-прежнему читаемо, по-прежнему атрибутировано. Более
ранняя ошибка — это факт о записи, а не то, что следует стереть из неё.
Каждое утверждение достигает своего автора за два перехода. Сущность
знания обнаруживается Session; Session направляется Person. Оба ребра
записываются инструментами, которые отказываются работать без реального
руководителя. Поэтому «кто это сказал, когда и с какой целью» всегда можно
установить — не по соглашению, а потому что не существует пути кода, который
создаёт знание без этого.
Идентичность никогда не выводится из строки. Семнадцать узлов с именем
«Alice Example» в одиннадцати доменах — это семнадцать актов ссылки,
корректно различных. Утверждение, что два из них — один человек, является
утверждением, которое кто-то делает в сеансе, записанным как REFERENT_CLAIM,
способным нести значение distinct — потому что система, в которой нет места
для записи ответа нет, будет бесконечно задавать один и тот же вопрос.
Сопоставление идентичности по строкам — это то, где большинство графов знаний
тихо начинают лгать.
Структура несёт факты; свойства не дублируют их. Сущность знания не
содержит свойства domain. Она помещается в домен сеансом, который её
обнаружил, и достигается оттуда обходом. Свойство, которое предшествовало
этому, дрейфовало — именно так денормализации и делают: 21 сущность несла
строку domain, указывающую на реальный домен, к которому не было пути. Факт,
хранящийся как текст рядом со структурой, а не через неё, — это факт, который
в конечном итоге разойдётся со структурой.
Поле confidence отсутствует намеренно. Уверенность кого-то в конкретном
случае — это факт об их опыте и не передаётся; более поздний читатель выводит
свою собственную уверенность из описания, сопоставляя его с тем, что он знает.
То, к чему стремятся оценки уверенности, передаётся рёбрами, которые любой
читатель может оценить: VALIDATION, INVALIDATING и Challenge без парного
Solution.
Если вы сами сталкивались с этими стенами при эксплуатации накопительной системы памяти в масштабе, мы хотим услышать вас.
Related MCP server: attestor
Архитектура
Процессный слой (неизменяемый) — Person → Session, внутри Domain → Session. NEXT_SESSION всегда указывает вперёд во времени, что обеспечивается
инструментом. Членство в этом слое — это способность удерживать возможные
будущие и измерять их по отношению к реализации; ничто здесь не является
референтом.
Слой знаний (только добавление) — 11 онтологических типов и 7 под-меток,
связанных 13 типами связей, каждый узел помечен :Knowledge. Изменения
описания создают новый узел цепочки, связанный через EVOLVED_FROM.
См. HOWTO.xml для обучающего материала для оператора, который следует давать
LLM в качестве инвариантного каркаса, и docs/design/ для обоснования каждого
обязательства.
Предварительные требования
Python 3.10+
Экземпляр Neo4j 5.x (локальный или удалённый)
uv (для разработки; не требуется для установки)
Быстрый старт
pip install kenning-continuity
kenning-continuity --db-url bolt://localhost:7687Или из исходников:
uv sync
uv run kenning-continuity --db-url bolt://localhost:7687Конфигурация
Флаги CLI имеют приоритет над переменными окружения, которые имеют приоритет над значениями по умолчанию.
Флаг CLI | Переменная окружения | По умолчанию | Описание |
|
|
| URL подключения к Neo4j |
|
|
| Имя пользователя Neo4j |
|
|
| Пароль Neo4j |
|
|
| Имя базы данных Neo4j |
|
|
|
|
|
| (нет) | Префикс имени инструмента (например, |
|
|
| Таймаут чтения запроса, секунды |
|
|
| HTTP-хост (транспорты, отличные от stdio) |
|
|
| HTTP-порт (транспорты, отличные от stdio) |
|
|
| HTTP-путь (транспорты, отличные от stdio) |
|
| (нет) | Разрешённые CORS-источники через запятую |
|
| (нет) | Разрешённые хосты через запятую, защита от DNS-rebinding |
Конфигурация MCP-клиента
Claude Desktop / Claude Code
{
"mcpServers": {
"temporal-knowledge": {
"command": "kenning-continuity",
"args": ["--db-url", "bolt://localhost:7687"]
}
}
}HTTP-транспорт
kenning-continuity \
--db-url bolt://localhost:7687 \
--transport streamable-http \
--server-host 0.0.0.0 \
--server-port 8000 \
--allow-origins "http://localhost:3000" \
--allowed-hosts "localhost,127.0.0.1"Поверхность инструментов (23 инструмента)
Сеанс выполняется: create_domain (один раз) → begin_session →
создание / эволюция / подтверждение / связывание знаний → end_session.
Сервер не хранит состояние. begin_session возвращает session_id, который
клиент передаёт каждому последующему инструменту знаний. Сеанс, который никогда
не закрывался, остаётся active — это задумано.
Процесс (4)
Инструмент | Описание |
| Все домены с количеством сеансов и последней активностью |
| Создать домен знаний (идемпотентно) |
| Начать сеанс; возвращает |
| Закрыть сеанс с резюме того, что было изучено |
begin_session возвращает количество по типам, а не состояние домена.
Возврат состояния встроенно составлял 600 820 символов в одном
производственном домене — примерно 150 тыс. токенов потрачено до того, как
сеанс задал вопрос. Вызовите get_domain_state с types и limit для той
части, которая вам действительно нужна.
Мутация знаний (6)
Инструмент | Описание |
| Создание сущностей. Отказывает при коллизии, отказывает для процессных типов и отклоняет неизвестные поля, а не игнорирует их |
| Единственный способ изменить описание. Создаёт новый узел цепочки, сохраняя предыдущий через |
| Записать, что сущности были проверены и найдены неизменными |
| Сжать цепочку |
| Связать сущности. Принимает |
| Утверждать, что два референта — одно и то же, с обязательным |
Запросы (5)
Инструмент | Описание |
| Полнотекстовый поиск по именам и описаниям, только головы цепочек |
| Текущие сущности для домена; опционально |
| Кто над чем работал, когда и с какой целью |
| Обход |
| Cypher-запасной выход только для чтения; записи отклоняются |
Таксономия (2)
Инструмент | Описание |
| 11 онтологических типов и 7 под-меток, с решёткой |
| 13 типов рёбер знаний и 5 типов процессных рёбер |
Аналитика графа (6)
Инструмент | Описание |
| Создать проекцию графа GDS |
| Удалить проекцию |
| Центральность PageRank |
| Центральность по посредничеству — узлы-мосты |
| Обнаружение сообществ Лувена |
| Слабосвязные компоненты |
Система типов
Каждый узел знания несёт :Knowledge, ровно одну онтологическую метку,
свойство ont_type, детерминированно называющее эту метку, и ноль или более
под-меток через мульти-метки Neo4j.
Онтологический тип | Что это такое |
| То, что действует; обладает агентностью |
| Устройство без агентности; устойчивая форма |
| Созданный объект, который сохраняется и на который можно ссылаться |
| Место, кампус, регион или территория — всегда объект ссылки, никогда — источник ссылки |
| Событие, локализованное во времени |
| Осознание, открытие, прорыв |
| Повторяющаяся структура, распознаваемая в разных экземплярах |
| Препятствие в настоящем времени |
| Решение, которое сработало; образует пару с |
| Правило, выведенное из опыта |
| Причина, стоящая за чем-то |
Суб-метки образуют решётку, а не плоскую карту
PersonReferent → Actor System → Structure
Organization → Actor Process → Structure
Team → Organization → Actor Configuration → Structure
Service → Structurecreate_knowledge принимает либо онтологический тип (Actor), либо суб-метку
(Team) и применяет всю цепочку: :Knowledge:Actor:Organization:Team.
Поэтому запрос по организациям находит команды. Плоская карта выдала бы
:Actor:Team, молча отбросив средний уровень, и ничто бы об этом не сообщило.
Типы связей (13)
EVOLVED_FROM, ENABLING, REQUIRING, INFORMING, CAUSING, COMPOSING,
EXTENDING, RECOGNITION, VALIDATION, INVALIDATING, ASSOCIATED_WITH,
SITUATED_AT, REFERENT_CLAIM.
Процессные рёбра — HAS_SESSION, NEXT_SESSION, DIRECTED, DISCOVERED,
CONFIRMED — записываются только процессными инструментами и не могут быть
созданы через create_connections.
Что должно содержать описание
Описание говорит о том, чем сущность является, а не о том, что с ней или
вокруг неё произошло. Временные наблюдения относятся к узлам Event,
достижимым через рёбра.
Правильно, для
Actor:PersonReferent: «Основатель lululemon. Крупнейший индивидуальный акционер (8,4%). Подан по форме Schedule 13D — не пассивный.»Неправильно: «SCHEDULE 13D/A Amendment No. 10 filed Oct 8, 2025. WILSON GOES PUBLIC…»
Файлинг является Event. Уилсон является основателем. То, что файлинг
раскрывает что-то о нём, — это ребро INFORMING. Его описание должно пережить
любое количество будущих файлингов без изменений, если только не изменится
сама его идентичность.
Разработка
uv sync --group dev
./.venv/bin/pytest tests/unit # mocked substrate, no database
./.venv/bin/pytest tests/integration # real Neo4j via testcontainers; needs Docker
./.venv/bin/pyrightДефект, живущий в Cypher-запросе, невидим для модульных тестов — они
имитируют подложку, и однажды баг в создании рёбер прошёл все тесты одинаково
и до, и после исправления. Всё, что касается запросов, должно находиться в
tests/integration/.
Лицензия и атрибуция
Лицензировано под Apache License, Version 2.0. Используйте, модифицируйте, запускайте в продакшене — коммерчески или иначе.
Работа здесь — это онтология: решётка типов, разрешение обходом, размещение
эпистемического статуса в рёбрах, принцип, что каждый инвариант живёт в
инструменте. Это отдаётся свободно, и Apache-2.0 просит лишь, чтобы атрибуция
путешествовала вместе с ней: сохраняйте LICENSE и NOTICE и отмечайте, что
вы изменили.
Название Kenning AI не является частью этого гранта (Apache-2.0 §6). Смотрите
TRADEMARKS.md, что можно делать без разрешения, — а это
почти всё, включая указание того, на чём построено ваше программное
обеспечение.
Контакты
contact@kenningai.com — без форм, без воронок, письмо доходит до нас напрямую.
Нам особенно интересно услышать тех, кто запускал накопительную систему памяти в масштабе и сформировал мнение о том, почему они терпят неудачу. Этот режим отказа — причина почти каждого решения в этом репозитории, и несогласие того, кто столкнулся с этим сам, для нас ценнее, чем согласие того, кто не сталкивался.
Kenning AI · kenningai.com
This server cannot be deployed
Maintenance
Related MCP Connectors
Company brain for AI agents — temporal knowledge graph search, exploration, and durable memory.
Shared memory for AI agents, as a graph in your own Postgres. Writes never call an LLM.
Persistent knowledge graph for AI agents. Remember, recall, and forget facts.
Shared long-term memory for AI agents: save and recall context as a searchable knowledge graph.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables AI agents to store, retrieve, and connect information in a Neo4j graph database as persistent memory, with semantic relationships, natural language search, and temporal tracking across conversations.9179 npm67MIT
- AlicenseNot gradedqualityCmaintenanceAudit-grade memory backbone for agent teams. Bi-temporal facts (event time + transaction time, with recall(as_of=...) replay), 6-step deterministic retrieval (no LLM in the critical path), conversation ingest with speaker-locked dual-pass extraction, per-tenant Postgres row-level security, and Ed25519-signed provenance. Postgres + pgvector + Neo4j defaults.37 PyPI14MIT
- AlicenseNot gradedqualityDmaintenanceProvides persistent knowledge graph memory for AI agents, enabling them to store, recall, and query facts about people, projects, and relationships across sessions.MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server that lets LLM agents accumulate organizational knowledge across sessions, scoped by domain, backed by Neo4j with enforced structural invariants.-