原型 · 预览版:收录官方注册中心里的全部服务器,每 30 分钟同步一次。评价和账户功能将在后续阶段推出。
PopNx MCP为使用 AI 的人准备的 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

你需要

  • PyPI已安装 Python 的 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 只能连接互联网上的服务器。请选择其他应用。

你的选择通过 Cookie 保存在这台设备上,无需账户。

需要你填写的值

  • 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月6日

  • ✓ 通过

    作者与仓库一致

    注册名称已通过 GitHub 账户 cunicopia-dev 验证,该账户拥有此仓库

  • … 尚未检查

    仍在维护

    我们还没有从 GitHub 读取这个仓库

  • … 尚未检查

    有许可证

    我们还没有从 GitHub 读取这个仓库

  • – 不适用

    端点有响应

    它在你的电脑上运行,没有互联网端点

  • – 不适用

    使用 OAuth 登录

    在你的电脑上运行,改用本地设置

  • … 尚未检查

    工具描述中没有隐藏指令

    它在你的电脑上运行;我们只能读取互联网端点的工具列表

与“数据库与数据集”中的其他服务器比较i

  • 星标数多于此分类中其他 953 个服务器的 0%
  • 发布到注册中心的时间比此分类中其他 953 个服务器的 17% 更新
  • 基础检查结果等于或优于此分类中其他 953 个服务器的 100%

与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。

常见问题

Knowledge Graph RDBMS 安全吗?

它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。

它需要哪些密钥或代码?

注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。

它在我的电脑上运行还是在云端?

它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。

它还在维护吗?

GitHub 仓库最后更新于–,最新版本(0.1.9)于4个月前进入注册中心。

哪些应用可以使用它?

支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 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前天更新
安装

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