Skip to main content
Glama
temporal-knowledge

temporal-knowledge

by kenningai

Kenning Continuity

积累而非退化的企业知识。

一个 MCP 服务器,让 LLM 代理跨会话积累组织知识,按领域限定,以 Neo4j 为后端。每个结构不变量都由工具强制执行,而不是在指令中要求,并且不暴露任何原始 Cypher 写入——因此无论模型决定做什么,图都不会自我损坏。

它已在企业规模上投入生产:37 个领域、376 个会话,以及四个月日常使用中积累的 3,000+ 知识实体。

为什么它不会随着填充而退化

大多数累积式记忆系统以两种方式之一失败。它们从第一天起就开始虚构,因为没有任何东西区分被观察到的事物与模型为了帮忙而推断出的事物。或者它们通过了演示,然后在体量下退化,因为每次写入都是不受约束的追加,存储中慢慢充满近似重复、静默覆盖,以及无人能追溯到作者的声明。

四项承诺,全部在结构上强制执行:

没有任何内容被覆盖。 没有 update_knowledge,也没有 retype_knowledge。改变对某个实体的已知信息会创建一个新节点,通过 EVOLVED_FROM 链接到其前身。先前的理解仍然存在、仍然可读、仍然可追溯。早先出错是记录的一个事实,而不是要从记录中抹去的东西。

每项声明都在两跳内到达其作者。 知识实体由 Session 发现;Session 由 Person 指导。两条边都由拒绝在没有真实指导者的情况下运行的工具写入。因此"谁说的、何时说的、出于什么目的"总是可以回答的——不是靠约定,而是因为没有代码路径可以在缺少这些信息的情况下创建知识。

身份从不从字符串推断。 分布在十一个领域中的十七个名为"Alice Example"的节点是十七个指称行为,正确地彼此区分。断言其中两个是同一个人,是某人在会话中做出的声明,记录为可以携带 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 链接的新链节点。

参见 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 标志

环境变量

默认值

描述

--db-url

NEO4J_URI 或 NEO4J_URL

bolt://localhost:7687

Neo4j 连接 URL

--username

NEO4J_USERNAME

neo4j

Neo4j 用户名

--password

NEO4J_PASSWORD

password

Neo4j 密码

--database

NEO4J_DATABASE

neo4j

Neo4j 数据库名称

--transport

NEO4J_TRANSPORT

stdio

stdio、sse 或 streamable-http

--namespace

NEO4J_NAMESPACE

(无)

工具名称前缀(例如 myapp → myapp-begin_session)

--read-timeout

NEO4J_READ_TIMEOUT

30

读取查询超时,秒

--server-host

NEO4J_MCP_SERVER_HOST

127.0.0.1

HTTP 主机(非 stdio 传输)

--server-port

NEO4J_MCP_SERVER_PORT

8000

HTTP 端口(非 stdio 传输)

--server-path

NEO4J_MCP_SERVER_PATH

/mcp/

HTTP 路径(非 stdio 传输)

--allow-origins

NEO4J_MCP_SERVER_ALLOW_ORIGINS

(无)

逗号分隔的 CORS 来源

--allowed-hosts

NEO4J_MCP_SERVER_ALLOWED_HOSTS

(无)

逗号分隔的主机,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)

工具

描述

list_domains

所有领域及其会话计数和最近活动

create_domain

创建一个知识领域(幂等)

begin_session

开始一个会话;返回 session_id。domain、purpose、director 和 director_key 都是必需的——指导者的 Person 节点在这里创建,且仅在这里创建

end_session

以所学内容的摘要关闭会话

begin_session 返回按类型的计数,而不是领域状态。在一个生产领域上,内联返回状态是 600,820 个字符——在会话提出任何问题之前就花费了大约 150k 个 token。使用 types 和 limit 调用 get_domain_state 来获取你实际需要的部分。

知识变更(6)

工具

描述

create_knowledge

创建实体。遇到冲突时拒绝,拒绝流程类型,并拒绝未知字段而不是丢弃它们

evolve_knowledge

改变描述的唯一方式。创建一个保留先前节点的新链节点,通过 EVOLVED_FROM 链接;保持本体论类型,替换子标签集合

confirm_knowledge

记录实体已被审查且未发生变化

merge_knowledge

将 EVOLVED_FROM 链压缩为一个规范节点。破坏性——无法撤销

create_connections

链接实体。接受 session_id 并将其记录在每条边上——边是一个断言,并到达其作者

claim_referent

声明两个指称对象是同一个事物,需要 resolution:proposed、confirmed 或 distinct

查询(5)

工具

描述

search_knowledge

跨名称和描述的全文本搜索,仅限链头

get_domain_state

领域的当前实体;可选 types、limit、descriptions

get_session_history

谁在何时、出于什么目的做了什么

get_chain_history

向后遍历 EVOLVED_FROM——之前理解的是什么

read_cypher

只读 Cypher 逃生舱;写入被拒绝

分类(2)

工具

描述

list_knowledge_types

11 种本体论类型和 7 个子标签,以及格结构

list_connection_types

13 种知识边类型和 5 种流程边类型

图分析(6)

工具

描述

gds_create_projection

创建 GDS 图投影

gds_drop_projection

删除投影

gds_pagerank

PageRank 中心性

gds_betweenness

介数中心性——桥接节点

gds_louvain

Louvain 社区检测

gds_wcc

弱连通分量

类型系统

每个知识节点都携带 :Knowledge、恰好一个本体论标签、一个确定性命名该标签的 ont_type 属性,以及通过 Neo4j 多标签实现的零个或多个子标签。

本体类型

它是什么

Actor

行动者;具有能动性

Structure

无能动性的排列;持续存在的形态

Artifact

产生后持续存在且可被引用的产物

Place

地点、园区、区域或范围——始终是被指称者,绝非指称者

Event

在时间上定位的事件

Insight

领悟、发现、突破

Pattern

跨实例识别出的重复结构

Challenge

当前时态的障碍

Solution

行之有效的解决方案;与 Challenge 配对

Lesson

从经验中推导出的规则

Rationale

某事物背后的原因

子标签是格结构,而非扁平映射

PersonReferent → Actor          System        → Structure
Organization   → Actor          Process       → Structure
Team           → Organization → Actor         Configuration → Structure
                                              Service       → Structure

create_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 公开表态……"

申报文件是一个 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/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

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Audit-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 PyPI
    14
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides persistent knowledge graph memory for AI agents, enabling them to store, recall, and query facts about people, projects, and relationships across sessions.
    MIT