temporal-knowledge
Kenning Continuity
劣化ではなく蓄積するエンタープライズ知識。
LLMエージェントがセッションをまたいで組織知識を蓄積できるようにするMCPサーバー。ドメイン単位でスコープされ、Neo4jをバックエンドとする。すべての構造的不変条件は指示ではなくツールによって強制され、生のCypher書き込みは公開されない。そのため、モデルが何をしようとグラフが自己破壊することはない。
エンタープライズ規模で本番稼働している:37ドメイン、376セッション、3,000以上の知識エンティティが4ヶ月の日常利用で蓄積された。
なぜこれは満たされても劣化しないのか
ほとんどの蓄積型メモリシステムは、2つのいずれかの方法で失敗する。観察された事実と、役に立とうとするモデルが推論した事実を区別するものが何もないため、初日から作話を起こす。あるいは、デモは成功しても、規模が大きくなるにつれて劣化する。すべての書き込みが制約のない追記であり、ストアには類似重複、無言の上書き、誰にも作成者を辿れない主張が徐々に蓄積されていくからだ。
4つのコミットメント。すべて構造的に強制される:
何も上書きされない。 update_knowledge も retype_knowledge も存在しない。エンティティについて既知の内容を変更すると、EVOLVED_FROM によって先行ノードにリンクされた新しいノードが作成される。以前の理解は依然として存在し、読み取り可能であり、帰属も可能である。以前に誤っていたことは記録の事実であり、そこから消去されるべきものではない。
すべての主張は2ホップでその作成者に到達する。 知識エンティティは Session によって発見され、Session は Person によって指揮される。両方のエッジは、実際の指揮者なしでは実行を拒否するツールによって書き込まれる。つまり「誰が、いつ、どのような目的のためにこれを述べたか」は常に答えられる。慣習によるのではなく、それを欠いたまま知識を作成するコードパスが存在しないからだ。
同一性は文字列から推論されることはない。 11のドメインにまたがる「Alice Example」という名前の17のノードは、17の参照行為であり、正しく区別されている。そのうちの2つが同一人物であると主張することは、誰かがセッション内で行う主張であり、distinct という値を保持できる REFERENT_CLAIM として記録される。いいえという答えを記録する場所がないシステムは、同じ質問を永遠に繰り返すことになるからだ。文字列マッチングによる同一性判定は、多くのナレッジグラフが静かに嘘をつき始める場所である。
構造が事実を担い、プロパティはそれを複製しない。 知識エンティティは domain プロパティを保持しない。エンティティは、それを発見したセッションによってドメインに配置され、そこからウォークによって到達される。これに先立つプロパティは乖離していた。非正規化がそうするように:21のエンティティが、実際にはそれらへのパスがまったく存在しない実在のドメインを指す domain 文字列を保持していた。構造の隣にテキストとして保持される事実は、構造によって保持されるのではなく、最終的には構造と矛盾する事実である。
confidence フィールドは意図的に存在しない。ある場面での誰かの確信度はその人の経験に関する事実であり、伝達されない。後の読者は、自分が知っていることと照らし合わせて説明から独自の確信度を導き出す。確信度スコアが目指していたものは、代わりに読者が誰でも判断できるエッジによって担われる:VALIDATION、INVALIDATING、そして対になる Solution のない Challenge である。
蓄積型メモリシステムを大規模に運用し、これらの壁に自ら直面したことがあるなら、ぜひご意見をお聞かせください。
Related MCP server: attestor
アーキテクチャ
プロセス層(不変)— Person → Session、Domain → Session 内。NEXT_SESSION は常に時間的に前方を指し、ツールによって強制される。この層への所属は、可能な未来を保持し、実現に向けて測定する能力である。ここには参照対象は存在しない。
知識層(追記専用)— 11のオントロジータイプと7のサブラベルが、13の接続タイプで接続され、すべてのノードが :Knowledge とマークされる。説明の変更は、EVOLVED_FROM によってリンクされた新しいチェーンノードを作成する。
オペレーター向けの、LLMに不変条件の足場として与える教示については HOWTO.xml を、各コミットメントの背後にある理由については 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 flag | Env var | Default | Description |
|
|
| Neo4j接続URL |
|
|
| Neo4jユーザー名 |
|
|
| Neo4jパスワード |
|
|
| Neo4jデータベース名 |
|
|
|
|
|
| (none) | ツール名プレフィックス(例: |
|
|
| 読み取りクエリのタイムアウト(秒) |
|
|
| HTTPホスト(非stdioトランスポート) |
|
|
| HTTPポート(非stdioトランスポート) |
|
|
| HTTPパス(非stdioトランスポート) |
|
| (none) | カンマ区切りのCORSオリジン |
|
| (none) | カンマ区切りのホスト。DNSリバインディング保護 |
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)
Tool | Description |
| セッション数と最終アクティビティを含む全ドメイン |
| 知識ドメインを作成(冪等) |
| セッションを開始し、 |
| 学んだことの要約とともにセッションを閉じる |
begin_session はドメインの状態ではなく、タイプ別のカウントを返す。状態をインラインで返すと、ある本番ドメインでは600,820文字になり、セッションが質問をする前に約15万トークンを消費していた。実際に必要な部分については、types と limit を指定して get_domain_state を呼び出すこと。
知識ミューテーション(6)
Tool | Description |
| エンティティを作成。衝突時は拒否、プロセスタイプは拒否、未知のフィールドは破棄せず拒否 |
| 説明を変更する唯一の方法。 |
| エンティティがレビューされ、変更がないことを確認したことを記録 |
|
|
| エンティティをリンク。 |
| 2つの参照対象が同じものであると主張。必須の |
クエリ(5)
Tool | Description |
| 名前と説明に対する全文検索。チェーンの先頭のみ |
| ドメインの現在のエンティティ。オプション: |
| 誰がいつ何に、どのような目的のために取り組んだか |
|
|
| 読み取り専用のCypherエスケープハッチ。書き込みは拒否される |
タクソノミー(2)
Tool | Description |
| 11のオントロジータイプと7のサブラベル(ラティス付き) |
| 13の知識エッジタイプと5のプロセスエッジタイプ |
グラフ分析(6)
Tool | Description |
| GDSグラフプロジェクションを作成 |
| プロジェクションを削除 |
| PageRank中心性 |
| 媒介中心性 — ブリッジノード |
| Louvainコミュニティ検出 |
| 弱連結成分 |
タイプシステム
すべての知識ノードは :Knowledge、正確に1つのオントロジーラベル、そのラベルを決定的に命名する ont_type プロパティ、そしてNeo4jのマルチラベリングによる0個以上のサブラベルを保持する。
オントロジー型 | それが何か |
| 行為するもの。行為主体性を持つ |
| 行為主体性のない配置。持続する形状 |
| 生成され、持続し、参照可能な産物 |
| サイト、キャンパス、地域、または広がり — 常に指示対象であり、決して指示子ではない |
| 時間的に位置づけられた出来事 |
| 気づき、発見、突破口 |
| 複数の事例にわたって認識される反復構造 |
| 現在時制の障害 |
| 機能した解決策。 |
| 経験から導き出された規則 |
| 何かの背後にある理由 |
サブラベルはフラットな地図ではなく、格子(ラティス)である
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 修正第10号、2025年10月8日提出。WILSON GOES PUBLIC…」
提出書類は Event である。Wilson は創業者である。提出書類が彼について何かを明らかにすることは、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/pyrightCypher クエリに存在する欠陥はユニットテストには見えない — それらは基盤をモックしており、エッジ生成のバグがかつて修正の前後でそれらのすべてを同一に通過させたことがある。クエリに触れるものはすべて 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.-