프로토타입 · 미리 보기: 공식 레지스트리의 모든 서버를 담고 있으며 30분마다 동기화해요. 리뷰와 계정 기능은 다음 단계에서 열려요.
PopNx MCPAI를 쓰는 사람을 위한 MCP 서버 · 쉬운 말로 설명해요

Knowledge Graph RDBMS

제작자: cunicopia-dev버전 0.1.9i★ –i내 컴퓨터에서 실행
레지스트리 이름io.github.cunicopia-dev/knowledge-graph-rdbms

설치

개요

제작자가 쓴 설명(영어 원문)

A label property graph on SQLite/Postgres with multi-ontology routing and a gated MCP server.

PopNx MCP의 세 기둥

이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.

할 수 있는 일

이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.

  • 연결 방식: 내 컴퓨터에서 실행
  • 전송 방식: stdio
  • 카테고리: 데이터베이스 및 데이터셋

설치

쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.

설치하기 전에

  • 기본 점검: 1개 중 1개 통과
  • 내 컴퓨터에서 내 사용자 계정의 권한(파일, 네트워크, 앱)으로 실행돼요.
  • 직접 입력할 값: KGRDBMS_HOME, KGRDBMS_DEFAULT_ONTOLOGY

필요한 것

  • PyPIPython의 uv 설치(uvx 명령어용)

어떤 앱을 쓰세요?

위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.

Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요

{
  "mcpServers": {
    "knowledge-graph-rdbms": {
      "command": "uvx",
      "args": [
        "knowledge-graph-rdbms",
        "--from",
        "knowledge-graph-rdbms[mcp]",
        "kgrdbms-mcp"
      ],
      "env": {
        "KGRDBMS_HOME": "your-value",
        "KGRDBMS_DEFAULT_ONTOLOGY": "your-value"
      }
    }
  }
}

터미널에서 이 명령어를 실행하세요

claude mcp add knowledge-graph-rdbms --env KGRDBMS_HOME=your-value --env KGRDBMS_DEFAULT_ONTOLOGY=your-value -- uvx knowledge-graph-rdbms --from 'knowledge-graph-rdbms[mcp]' kgrdbms-mcp

실행하기 전에 빈 값을 채워 주세요.

Cursor에서 열기

또는 설정을 직접 복사하기

프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요

{
  "mcpServers": {
    "knowledge-graph-rdbms": {
      "command": "uvx",
      "args": [
        "knowledge-graph-rdbms",
        "--from",
        "knowledge-graph-rdbms[mcp]",
        "kgrdbms-mcp"
      ],
      "env": {
        "KGRDBMS_HOME": "your-value",
        "KGRDBMS_DEFAULT_ONTOLOGY": "your-value"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

VS Code에서 열기

또는 설정을 직접 복사하기

프로젝트의 .vscode/mcp.json에 붙여 넣으세요

{
  "servers": {
    "knowledge-graph-rdbms": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "knowledge-graph-rdbms",
        "--from",
        "knowledge-graph-rdbms[mcp]",
        "kgrdbms-mcp"
      ],
      "env": {
        "KGRDBMS_HOME": "your-value",
        "KGRDBMS_DEFAULT_ONTOLOGY": "your-value"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.

선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.

직접 입력할 값

  • KGRDBMS_HOME env
    Storage root for ontology databases and the event log. Defaults to ~/.kgrdbms.
  • KGRDBMS_DEFAULT_ONTOLOGY env
    Name of the default ontology used when a tool call omits the `ontology` argument. Defaults to "default".

이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.

할 수 있는 일

내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.

기본 점검i

누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 GitHub 계정 cunicopia-dev 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요

  • … 아직 점검 안 함

    계속 관리되고 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • … 아직 점검 안 함

    라이선스 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • – 해당 없음

    엔드포인트 응답

    내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요

  • – 해당 없음

    OAuth로 로그인

    내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요

  • … 아직 점검 안 함

    도구 설명에 숨겨진 지시 없음

    내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요

데이터베이스 및 데이터셋 카테고리의 다른 서버와 비교i

  • 이 카테고리의 다른 서버 952개 중 0%보다 스타가 많아요
  • 이 카테고리의 다른 서버 952개 중 17%보다 최근에 레지스트리에 공개됐어요
  • 기본 점검 결과가 이 카테고리의 다른 서버 952개 중 100%와 같거나 더 좋아요

레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.

자주 묻는 질문

Knowledge Graph RDBMS, 안전한가요?

해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.

어떤 키나 코드가 필요한가요?

레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.

내 컴퓨터에서 실행되나요, 클라우드에서 실행되나요?

내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).

아직 관리되고 있나요?

GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.9)은 4개월 전 레지스트리에 올라왔어요.

어떤 앱에서 쓸 수 있나요?

Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.

대신 쓸 수 있는 건 뭐가 있나요?

같은 카테고리에는: Supabase, MongoDB MCP Server, Elasticsearch MCP Server

대안

같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.

카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i

Supabase

제작자: supabase

MCP server for interacting with the Supabase platform

컴퓨터 또는 클라우드★ 2,993Apache-2.0오늘 업데이트
설치

MongoDB MCP Server

제작자: mongodb-js

MongoDB Model Context Protocol Server

내 컴퓨터에서 실행★ 1,157Apache-2.0그저께 업데이트
설치

Elasticsearch MCP Server

제작자: cr7258

MCP server for interacting with Elasticsearch

내 컴퓨터에서 실행★ 315Apache-2.014개월 전 업데이트
설치

제작자의 README

README 열기

제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.

knowledge-graph-rdbms

An embedded knowledge graph you own completely — in one SQLite file.

SQLite-native · zero-dependency core · MCP-ready · event-sourced · reversible.

Model anything as entities and relationships — agent memory, app ontologies, declarative datasets, "SQLite but my data is a graph" — without running Neo4j, RDF, Docker, or a separate graph service. No Cypher, no JVM, no server: five tables and one file you can copy, inspect, and version.

pip install "knowledge-graph-rdbms[mcp]"

write a fact — auto-creates the graph in one SQLite file

kg node add person:ada --kind Person --name "Ada Lovelace"

every write is logged; tail the log and roll any event back by id

kg events -n 5 kg revert

rebuild the graph as of any past moment — literal time travel

kg replay --upto 2026-01-01T00:00:00

expose the whole graph to an AI agent over MCP

kg serve

Agent / CLI / Python │ gated + logged writes │ SQLite label property graph │ replay · revert · time-travel

Python 3.10+ · MIT · zero-dependency core · library + CLI + MCP

The world isn't rows in a table — it's *things*, the kinds of things they are, and how they relate. A label property graph captures exactly that, and not much more: nodes (entities), typed edges (relationships), labels (sets), and JSON properties (everything else). There's no schema to design up front; meaning accretes as facts, and the shape stays as flexible as the domain it describes.

That flexibility is what makes it a natural substrate for AI agents. Hand an agent an MCP connection to this graph and it can do what agents are uniquely good at: read a domain, model what it learns, connect ideas, and reason over *structure* instead of prose. Every write is gated, attributed, and appended to an event log — so an agent can reshape the graph freely while you keep the receipts: audit it, replay it to any point in time, or roll a change back with one command. A memory that records *why*, not just *what* — in one embeddable file that travels wherever the agent runs: a laptop, a CI job, a serverless function, a Pi.

Small enough to hold in your head. Flexible enough to model anything.


Contents

  • Where it fits
  • Why not X?
  • The idea in 30 seconds
  • Design philosophy
  • The data model
  • Architecture: three front doors, one engine
  • Many ontologies: one control plane
  • Discovery: read the schema before you query
  • Cross-ontology: federation and the backbone
  • Event sourcing: the graph is a projection
  • The safety gate: invariants vs. policy
  • Install
  • Quickstart
  • Performance
  • RDF interop: export, SPARQL, RDF-star
  • Command reference
  • Project layout
  • Development
  • License

Where it fits

It's built for graphs you want to own completely — small enough to inspect, fast enough to embed, transparent enough to trust:

  • Embedded ontologies — a knowledge graph that ships inside a single app or service, in one file you can copy and version.
  • Agent & assistant memory — facts an AI can read and write over MCP, with a full audit trail and one-command rollback.
  • Declarative datasets — describe your base graph as YAML/JSON facts and replay them into a queryable graph, deterministically.
  • "SQLite, but my data is a graph" — the moment relational rows start describing relationships, this is their natural home.

The design center is read-heavy, single-writer, up to low millions of nodes — the same sweet spot as SQLite itself: one file, in-process, no server to run. That covers a surprising amount of real work. For workloads past that center, Performance maps out exactly where the curve bends and a purpose-built graph engine starts to earn its extra moving parts.


Why not X?

Honest comparisons — reach for the right tool, and know exactly when that tool is this one.

Why not Neo4j?

Use Neo4j when you need deep traversal, complex Cypher pattern matching, concurrent writers, or clustered graph infrastructure. Use kgrdbms when you want a small embedded graph, agent memory, auditability, local-first ownership, and SQLite deployment simplicity.

Why not NetworkX?

NetworkX is great for in-memory algorithms. kgrdbms is for persistent graph state with durable storage, CLI/MCP access, event history, and rollback.

Why not RDFLib?

RDFLib is for RDF graphs and linked-data workflows. kgrdbms is a label property graph with RDF as an export/import boundary, not a triplestore.

Why not just SQLite tables?

Because some domains are naturally entities and relationships, not rectangular tables. kgrdbms keeps the storage boring while making the model graph-shaped.


The idea in 30 seconds

A label property graph needs only four primitives:

PrimitiveWhat it is
Nodea stable id, a kind, a display name
Edgea typed, directed relationship between two nodes
Labelset memberships on a node (many per node)
Propertya JSON-valued key/value bag on a node *or* an edge

Store those in SQLite, add a few indexes, and you have a knowledge graph. Everything else in this project — traversal, an append-only history, a safety gate, the CLI, the MCP server — is built on top of those four facts.

from kgrdbms import Graph

with Graph(path="demo.db") as g: g.add_node("person:ada", kind="Person", name="Ada Lovelace", labels={"Person"}, properties={"born": 1815}) g.add_node("field:cs", kind="Field", name="Computer Science") g.add_edge("person:ada", "field:cs", "FOUNDED", properties={"year": 1843})

print(g.shortest_path("person:ada", "field:cs"))

flowchart LR

ada(["person:ada :Person born=1815"]) cs(["field:cs :Field"]) ada -->|"FOUNDED (year=1843)"| cs


Design philosophy

1. Boring storage is a feature. SQLite already solved durability, transactions, indexes, and recursive queries. We don't reinvent any of it. One file, copy it to back it up, open it with any SQLite tool to inspect it.

2. The schema fits on a screen. Five tables, no surprises. You can read the entire storage layer and know exactly where every fact lives. Legibility beats cleverness.

3. The state is a pure function of data. What you query is a *projection*. The source of truth is an append-only log of facts plus an optional declared seed. Your whole graph is reproducible: state = replay(seed + log). That one property buys audit, undo, and time-travel for free.

4. Mutation is gated, and the gate has two layers. When you let an agent rewrite your graph over a wire, you need rules. Some rules are *configurable* (policy); some must be *un-negotiable* (compiled-in invariants). We separate mechanism from policy on purpose.

5. One engine, many doors. A library call, a kg command, and an MCP tool all flow through the same gated, logged write path into the same file. There is no "CLI version" of the truth and "MCP version" of the truth — there's one.

6. Pay for speed only when you ask. Every single write commits on its own (safe by default). Bulk paths (batch(), add_nodes, add_edges) let you opt into ~10× throughput when you mean to.


The data model

The graph is five tables. That's the whole storage layer.

erDiagram

nodes ||--o{ node_labels : "is labeled" nodes ||--o{ node_properties : "has" nodes ||--o{ edges : "from / to" edges ||--o{ edge_properties : "has"

nodes { text id PK text kind text name text created_at } node_labels { text node_id FK text label } node_properties { text node_id FK text key text value_json } edges { text id PK text from_node FK text to_node FK text type } edge_properties { text edge_id FK text key text value_json }

Design notes that matter:

  • Edges are unique on `(from_node, type, to_node)`. Re-adding the same triple updates its properties instead of duplicating it. Idempotent by construction.
  • Properties are JSON. Values round-trip as whatever JSON type you store — ints, bools, lists, nested objects.
  • Foreign keys cascade. Delete a node and its labels, properties, and incident edges go with it, enforced by SQLite.
  • `slug()` deduplicates natural-language ids. Two strings that slugify the same become the same node — the load-bearing trick for turning prose concepts into stable ids.
  • Ids are CURIEs. person:ada-lovelace, company:apple — a compact URI: prefix:reference, where the prefix is a short stable type token and the reference is slugged (slug(name, prefix="person") mints them). It stays a plain string today and expands to a full IRI *only* the day you publish to the linked-data world, so interop is a cheap, additive option rather than a tax paid up front. The id is an *address*, not a record: identity goes in the id, changeable facts go in properties.

A sixth table, graph_events, holds the append-only history (see below). It shares the same file and connection.


Architecture: three front doors, one engine

flowchart TD

subgraph doors["front doors"] CLI["kg (command line)"] MCP["kgrdbms-mcp (MCP server)"] LIB["import kgrdbms (library)"] end

SVC["service.py — gated + logged write path"] GATE{"invariants.enforce then policy.mutation_check"} GRAPH[("SQLite file nodes · edges · labels · properties")] LOG[["graph_events (append-only log)"]]

CLI -->|writes| SVC MCP -->|writes| SVC LIB -->|writes| SVC SVC --> GATE GATE -->|"pass"| GRAPH GATE -->|"record fact"| LOG

CLI -.->|reads| GRAPH MCP -.->|reads| GRAPH LIB -.->|reads / fast bulk writes| GRAPH

The CLI, the MCP server, and your own Python code all mutate through service.py, so the safety gate and the event-log bookkeeping exist in exactly one place and can't drift between front doors.

The gate resolves invariants.enforce and policy.mutation_check *through their modules at call time* — so editing your policy (or monkeypatching it in a test) takes effect across every door at once.

The library also has a direct, fast, unlogged path (g.add_node(...),

g.add_nodes(...)). It's the right tool for bulk loading, but those writes

are

앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요

PopNx에게 묻기