Skip to main content
Glama
kenningai

temporal-knowledge

by kenningai

Kenning Continuity

퇴화하지 않고 축적되는 엔터프라이즈 지식.

LLM 에이전트가 여러 세션에 걸쳐 조직 지식을 축적할 수 있게 해주는 MCP 서버로, 도메인별로 범위가 지정되고 Neo4j로 뒷받침됩니다. 모든 구조적 불변식은 지시문으로 요청되는 것이 아니라 도구에 의해 강제되며, 원시 Cypher 쓰기가 노출되지 않으므로 모델이 어떤 결정을 내리든 그래프가 스스로를 손상시킬 수 없습니다.

엔터프라이즈 규모로 프로덕션에서 운영 중입니다: 37개 도메인, 376개 세션, 그리고 4개월간의 일일 사용으로 축적된 3,000개 이상의 지식 엔티티.

채워질수록 퇴화하지 않는 이유

대부분의 축적형 메모리 시스템은 두 가지 방식 중 하나로 실패합니다. 관찰된 것과 도움이 되려는 모델이 추론한 것을 구분하는 장치가 없기 때문에 첫날부터 공상(confabulation)을 일으킵니다. 또는 데모는 살아남지만 규모가 커지면서 퇴화합니다. 모든 쓰기가 제약 없는 추가(append)이고 저장소가 근사 중복, 조용한 덮어쓰기, 작성자까지 추적할 수 없는 주장들로 서서히 가득 차기 때문입니다.

네 가지 약속, 모두 구조적으로 강제됩니다:

아무것도 덮어쓰지 않습니다. update_knowledgeretype_knowledge도 없습니다. 엔티티에 대해 알려진 것을 변경하면 EVOLVED_FROM으로 이전 노드와 연결된 노드가 생성됩니다. 이전의 이해는 여전히 존재하며, 여전히 읽을 수 있고, 여전히 출처를 알 수 있습니다. 이전에 틀렸다는 것은 기록에 관한 사실이지, 기록에서 지워야 할 것이 아닙니다.

모든 주장은 두 홉 안에 작성자에게 도달합니다. 지식 엔티티는 Session에 의해 발견되고, SessionPerson에 의해 주도됩니다. 두 엣지 모두 실제 감독자 없이는 실행을 거부하는 도구에 의해 기록됩니다. 따라서 "누가, 언제, 어떤 목적으로 이것을 말했는가"는 항상 답할 수 있습니다. 관례가 아니라, 그것 없이는 지식을 생성하는 코드 경로가 존재하지 않기 때문입니다.

정체성은 문자열에서 추론되지 않습니다. 11개 도메인에 걸쳐 "Alice Example"이라는 이름을 가진 17개 노드는 17개의 지시 행위이며, 올바르게 구별됩니다. 그중 두 개가 한 사람이라고 주장하는 것은 누군가가 어떤 세션에서 하는 주장이며, distinct 값을 담을 수 있는 REFERENT_CLAIM으로 기록됩니다. 아니오라는 답을 기록할 곳이 없는 시스템은 같은 질문을 영원히 다시 묻게 되기 때문입니다. 문자열 일치로 정체성을 판단하는 곳에서 대부분의 지식 그래프는 조용히 거짓을 말하기 시작합니다.

구조가 사실을 담고, 속성은 사실을 중복하지 않습니다. 지식 엔티티는 domain 속성을 가지지 않습니다. 엔티티는 그것을 발견한 세션에 의해 도메인에 배치되며, 그곳에서 걷기(walk)를 통해 도달됩니다. 이전에 그 역할을 하던 속성은 어굿나 있었습니다. 이것이 비정규화가 하는 일입니다. 21개 엔티티는 실제 도메인을 가리키는 domain 문자열을 지니고 있었지만, 그 도메인으로 가는 경로가 전혀 없었습니다. 구조에 의해 보관되는 것이 아니라 구조 옆에 텍스트로 보관된 사실은 결국 구조와 어긋나게 되는 사실입니다.

confidence 필드는 의도적으로 없습니다. 어떤 사람이 어떤 자리에서 가진 확신은 그 사람의 경험에 관한 사실이며 전달되지 않습니다. 나중에 읽는 사람은 자신이 아는 것에 비추어 설명으로부터 자신만의 확신을 얻습니다. 신뢰도 점수가 얻고자 했던 것은 대신 어떤 독자라도 판정할 수 있는 엣지로 담깁니다: VALIDATION, INVALIDATING, 그리고 짝을 이루는 Solution이 없는 Challenge.

여러분이 규모 있는 축적형 메모리 시스템을 운영하면서 이런 벽들을 직접 겪어 보셨다면, 여러분의 이야기를 듣고 싶습니다.

Related MCP server: Neo4j Agent Memory MCP Server

아키텍처

프로세스 계층 (불변) — Domain → Session 안에서 Person → 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 flag

Env var

Default

Description

--db-url

NEO4J_URI or 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

(없음)

도구 이름 접두사 (예: myappmyapp-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_sessionsession_id를 반환하며, 클라이언트는 이 값을 이후의 모든 지식 도구에 전달합니다. 닫히지 않은 세션은 의도적으로 active 상태로 남아 있습니다.

프로세스 (4)

Tool

Description

list_domains

세션 수와 마지막 활동을 포함한 모든 도메인

create_domain

지식 도메인 생성 (멱등)

begin_session

세션 시작; session_id 반환. domain, purpose, director, director_key는 모두 필수 — 감독자의 Person 노드는 여기서만 생성됩니다

end_session

학습한 내용의 요약과 함께 세션 종료

begin_session은 도메인 상태가 아니라 유형별 개수를 반환합니다. 상태를 인라인으로 반환하는 것은 한 프로덕션 도메인에서 600,820자에 달했으며, 세션이 질문 하나를 하기 전에 약 150k 토큰이 소모되었습니다. 실제로 필요한 부분은 typeslimit를 사용해 get_domain_state를 호출하세요.

지식 변경 (6)

Tool

Description

create_knowledge

엔티티 생성. 충돌 시 거부하고, 프로세스 유형을 거부하며, 알 수 없는 필드는 버리지 않고 거부합니다

evolve_knowledge

설명을 변경할 수 있는 유일한 방법. 이전 노드를 EVOLVED_FROM으로 보존하는 새 체인 노드를 생성하고, 온톨로지 유형은 유지하며 하위 라벨 집합은 교체합니다

confirm_knowledge

엔티티들이 검토되었고 변경되지 않았음을 기록

merge_knowledge

EVOLVED_FROM 체인을 하나의 표준 노드로 압축. 파괴적 — 되돌릴 수 없음

create_connections

엔티티 연결. session_id를 받아 모든 엣지에 기록합니다 — 엣지는 주장이며 작성자에게 도달합니다

claim_referent

두 지시 대상이 같은 것이라고 주장. resolution 필수: proposed, confirmed, 또는 distinct

질의 (5)

Tool

Description

search_knowledge

이름과 설명에 대한 전체 텍스트 검색, 체인의 헤드(head)만

get_domain_state

도메인의 현재 엔티티; 선택적 types, limit, descriptions

get_session_history

누가 언제 무엇을 어떤 목적으로 작업했는지

get_chain_history

EVOLVED_FROM을 거꾸로 따라감 — 이전에 무엇으로 이해되었는지

read_cypher

읽기 전용 Cypher 탈출구; 쓰기는 거부됩니다

분류 체계 (2)

Tool

Description

list_knowledge_types

11개 온톨로지 유형과 7개 하위 라벨, 격자(lattice) 포함

list_connection_types

13개 지식 및 5개 프로세스 엣지 유형

그래프 애널리틱스 (6)

Tool

Description

gds_create_projection

GDS 그래프 프로젝션 생성

gds_drop_projection

프로젝션 제거

gds_pagerank

PageRank 중심성

gds_betweenness

매개 중심성 — 브리지 노드

gds_louvain

Louvain 커뮤니티 탐지

gds_wcc

약한 연결 컴포넌트

타입 시스템

모든 지식 노드는 :Knowledge를 지니고, 정확히 하나의 온톨로지 라벨, 그 라벨을 결정적으로 명명하는 ont_type 속성, 그리고 Neo4j 다중 라벨링을 통한 0개 이상의 하위 라벨을 가집니다.

존재론적 유형

정의

Actor

행위하는 것; 행위 주체성을 가짐

Structure

행위 주체성이 없는 배열; 지속적인 형태

Artifact

지속되며 참조될 수 있는 산출물

Place

장소, 캠퍼스, 지역 또는 범위 — 항상 지시 대상이지, 지시자가 아님

Event

시간적으로 위치한 사건

Insight

깨달음, 발견, 돌파구

Pattern

사례들에 걸쳐 인식되는 반복적 구조

Challenge

현재 시제의 장애물

Solution

효과가 있었던 해결책; Challenge와 짝을 이룸

Lesson

경험에서 도출된 규칙

Rationale

어떤 것의 배후에 있는 이유

하위 레이블은 평면 지도가 아니라 격자(lattice)다

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 쿼리에 존재하는 결함은 단위 테스트에 보이지 않는다 — 단위 테스트는 기반 계층을 모의(mock)하며, 엣지 생성 버그가 한때 수정 전후로 모든 테스트를 동일하게 통과한 적이 있다. 쿼리를 건드리는 모든 것은 tests/integration/에 속한다.

라이선스 및 출처 표시

Apache License, Version 2.0에 따라 라이선스가 부여됩니다. 상업적이든 아니든 사용, 수정, 프로덕션 실행이 가능합니다.

여기서의 작업은 존재론 그 자체 — 유형 격자, 걷기(walk)를 통한 해석, 엣지에 인식론적 지위를 배치하는 방식, 모든 불변식이 도구에 존재한다는 원칙 — 입니다. 이것은 자유롭게 제공되며, Apache-2.0은 출처 표시가 함께 전달되기만을 요구합니다: LICENSENOTICE를 유지하고, 변경한 내용을 표시하십시오.

Kenning AI라는 이름은 해당 허여(grant)의 일부가 아닙니다 (Apache-2.0 §6). 허락 없이 할 수 있는 것 — 거의 모든 것, 소프트웨어가 무엇을 기반으로 구축되었는지 말하는 것을 포함 — 에 대해서는 TRADEMARKS.md를 참조하십시오.

연락처

contact@kenningai.com — 양식도, 깔때기도 없이, 우리에게 직접 도달합니다.

우리는 특히 누적 메모리 시스템을 규모 있게 운영해 보았고 그것이 왜 실패하는지에 대한 견해를 형성한 사람들의 연락에 관심이 있습니다. 그 실패 모드는 이 저장소의 거의 모든 결정의 이유이며, 직접 그 실패를 겪어 본 사람의 반대 의견은 겪어 보지 못한 사람의 동의보다 우리에게 더 가치가 있습니다.


Kenning AI · kenningai.com

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityNo data
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables storage and retrieval of knowledge in a graph database format, allowing users to create, update, search, and delete entities and relationships in a Neo4j-powered knowledge graph through natural language.
    5
    -
  • A
    license
    Not graded
    quality
    B
    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.
    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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kenningai/kenning-continuity'

If you have feedback or need assistance with the MCP directory API, please join our Discord server