知识图谱内存服务器

高性能的Rust实现的知识图谱内存服务器,支持SQLite后端、全文搜索和自动去重,适用于需要持久化存储和高效查询的场景。

  • by ssoj13
  • Rust
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 ssoj13/memory-mcp-rs

使用说明

内存MCP服务器(Rust+SQLite)

MCP内存服务器的高性能Rust实现——持久克劳德内存的知识图。

原始项目

这是一个Rust端口 模型上下文协议服务器 内存服务器。原始的TypeScript实现可以在 官方MCP服务器存储库.

特性

  • SQLite后端: 快速、可靠、符合ACID标准的存储
  • 全文搜索: FTS5用于跨名称、类型和观察值进行高效搜索
  • 自动重复数据删除: SQLite约束可防止重复的实体和关系
  • 级联删除: 外键约束会自动清理孤立关系
  • 异步I/O: 基于东京的非阻塞操作
  • 索引查询: O(log n)查找而不是O(n)扫描
  • 符合MCP标准: 通过rmcp SDK完全支持MCP协议
  • 类型安全: Rust的类型系统可以防止常见的bug

安装

cd rust/memory-mcp-rs
cargo build --release

二进制文件将位于 target/release/memory-mcp-rs (或 .exe 在Windows上)。

运输方式

服务器支持两种传输模式:

stdio模式(默认)

  • 使用案例: 本地MCP客户端(克劳德桌面、克劳德代码、Codex)
  • 协议: 标准输入/标准输出上的JSON-RPC
  • 登录中: 默认情况下为静音(防止MCP握手问题),可选文件日志记录 --log
  • 命令: memory-mcp-rs 或 memory-mcp-rs --log server.log

HTTP流模式

  • 使用案例: 远程访问、web应用程序、调试、测试
  • 协议: HTTP与服务器发送事件(SSE)
  • 终点:
    • /mcp -MCP协议端点
    • /health -健康检查(返回“OK”)
  • 登录中: 始终启用stderr,可选文件日志记录 --log
  • 命令: memory-mcp-rs --stream --port 8000

用法

搜索语义(FTS)

  • 搜索使用SQLite FTS5,但每个术语都会被屏蔽:不支持FTS运算符(or/near/*)。
  • 行为:查询中的所有单词都以逻辑和方式组合。短语只作为一组单词工作。
  • 原因:避免语法错误和用户查询中的注册表。

CLI选项

Usage: memory-mcp-rs [OPTIONS]

Options:
      --db-path <DB_PATH>    Database file path (default: system data dir or MEMORY_FILE_PATH env)
  -s, --stream               Enable streamable HTTP mode (default: stdio)
  -p, --port <PORT>          HTTP port for stream mode [default: 8000]
  -b, --bind <BIND>          Bind address for stream mode [default: 127.0.0.1]
  -l, --log [<FILE>]         Enable file logging [default: memory-mcp-rs.log]
  -h, --help                 Print help
  -V, --version              Print version

stdio模式示例

# Default path: %LOCALAPPDATA%/mcp-memory/knowledge_graph.db (Windows)
# or ~/.local/share/mcp-memory/knowledge_graph.db (Linux/Mac)
memory-mcp-rs

# Custom database path (CLI flag)
memory-mcp-rs --db-path /path/to/graph.db

# Custom database path (environment variable)
MEMORY_FILE_PATH=/path/to/graph.db memory-mcp-rs

# With file logging (for debugging)
memory-mcp-rs --log debug.log

HTTP流模式示例

# Start HTTP server on default port 8000
memory-mcp-rs --stream

# Custom port and bind address
memory-mcp-rs --stream --port 9000 --bind 0.0.0.0

# With logging to both console and file
memory-mcp-rs --stream --log server.log

# Health check
curl http://localhost:8000/health
# Returns: OK

使用克劳德桌面

stdio模式 -添加到MCP配置:

视窗 (%APPDATA%\Claude\claude_desktop_config.json):

{
  "mcpServers": {
    "memory": {
      "command": "C:\\path\\to\\memory-mcp-rs.exe"
    }
  }
}

macOS/Linux (~/.config/claude/claude_desktop_config.json):

{
  "mcpServers": {
    "memory": {
      "command": "/path/to/memory-mcp-rs"
    }
  }
}

使用克劳德代码

stdio模式 -添加到 .claude/mcp.json:

{
  "mcpServers": {
    "memory": {
      "command": "memory-mcp-rs",
      "args": []
    }
  }
}

HTTP流模式 -单独启动服务器,然后配置:

# Terminal 1: Start HTTP server
memory-mcp-rs --stream --port 8000

# Terminal 2: Add to .claude/mcp.json
{
  "mcpServers": {
    "memory-http": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

与Codex合作

stdio模式 -添加到Codex MCP配置:

{
  "mcpServers": {
    "memory": {
      "command": "memory-mcp-rs"
    }
  }
}

HTTP流模式 -单独启动服务器:

# Terminal 1: Start HTTP server
memory-mcp-rs --stream --port 8000 --log server.log

# Terminal 2: Configure Codex to use http://localhost:8000/mcp

MCP工具

工具 说明
create_entities 在知识图中创建新实体
create_relations 在实体之间创建关系
add_observations 向实体添加观察结果
delete_entities 删除实体(级联删除关系)
delete_observations 删除具体观察结果
delete_relations 删除特定关系
read_graph 阅读整个知识图谱
search_nodes 跨实体的全文搜索
open_nodes 按名称打开特定节点

建筑

src/
├── main.rs       # MCP server + tool routing + dual-mode transport
├── logging.rs    # Transport-aware logging (stdio vs HTTP)
├── graph.rs      # Data structures (Entity, Relation, KnowledgeGraph)
├── manager.rs    # Async manager wrapping storage
└── storage.rs    # SQLite implementation

SQLite架构

-- Entities
CREATE TABLE entities (
    name TEXT PRIMARY KEY,
    entity_type TEXT NOT NULL,
    observations TEXT NOT NULL  -- JSON array
);

-- Relations with cascade delete
CREATE TABLE relations (
    from_entity TEXT NOT NULL,
    to_entity TEXT NOT NULL,
    relation_type TEXT NOT NULL,
    FOREIGN KEY(from_entity) REFERENCES entities(name) ON DELETE CASCADE,
    FOREIGN KEY(to_entity) REFERENCES entities(name) ON DELETE CASCADE
);

-- FTS5 for full-text search
CREATE VIRTUAL TABLE entities_fts USING fts5(
    name, entity_type, observations,
    content=entities
);

演出

操作 JSONL SQLite
搜索 O(n) O(对数n) 使用FTS5
插入 O(n) O(对数n)
删除 O(n) O(对数n)
级联删除 手动 自动

测试

# Run all tests (integration + HTTP transport)
cargo test

# Run only integration tests
cargo test --test integration

# Run only HTTP transport tests
cargo test --test http_transport

测试覆盖范围:

  • 23个集成测试(SQLite、CRUD、FTS5、验证)
  • 4个HTTP传输测试(健康检查、端点、日志记录)
  • 所有测试都使用临时数据库并自动清理

示例用法

use memory_mcp_rs::{graph::Entity, manager::KnowledgeGraphManager};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let manager = KnowledgeGraphManager::new("graph.db".into())?;

    // Create entity
    manager.create_entities(vec![
        Entity {
            name: "Alice".to_string(),
            entity_type: "person".to_string(),
            observations: vec!["Works at Acme".to_string()],
        }
    ]).await?;

    // Search
    let results = manager.search_nodes(Some("Acme".to_string())).await?;
    println!("Found {} entities", results.entities.len());

    Ok(())
}

与TypeScript版本的差异

架构更改

Aspect TypeScript(原始) Rust(此端口)
代码组织 单片式(index.ts,~470 LOC) 模块化(4个模块,~1200 LOC)
存储后端 JSONL文本文件 SQLite二进制数据库
数据模型 内存数组 带约束的关系表
文件结构 单文件+测试 graph.rs, storage.rs, manager.rs, main.rs

性能改进

操作 TypeScript Rust 改进
搜索 O(n)线性 .filter() O(log n)SQL LIKE +索引 快10-100倍
插入 O(n)完整文件重写 O(log n)SQL INSERT 快10-100倍
删除 O(n)+手动过滤器 O(log n)+CASCADE 快10-100倍
去重 手册 .some() 检查 自动(UNIQUE 约束) 零开销
级联删除 手动环路滤波 自动(FOREIGN KEY CASCADE) 零开销

数据完整性

特性 TypeScript Rust
ACID事务 ❌ 否 ✅ SQLite酸
外键验证 ❌ 手册 ✅ 自动
唯一约束 ❌ 手册 ✅ 数据库级别
故障恢复 ❌ 文件损坏 ✅ WAL日志
并发访问 ❌ 文件锁定问题 ✅ WAL模式(并发读取)

类型安全和记忆

Aspect TypeScript Rust
类型检查 运行时(Zod模式) 编译时(Rust类型)
内存安全 垃圾回收器 所有权+借用检查器
零安全 undefined 检查 Option<T> / Result<T, E>
错误处理 例外情况 Result<T, E> + anyhow

并发模型

特性 TypeScript Rust
异步运行时 单线程事件循环 Tokio多线程
I/O模型 非阻塞(Node.js) 非阻塞(async/await)
文件锁定 操作系统级别(fs模块) SQLite连接池

测试

Aspect TypeScript Rust
框架 Vitest(2个测试文件) Cargo测试(11个集成测试)
覆盖 基本CRUD 完整CRUD+边缘情况+持久性
隔离 共享测试文件 每个测试的临时数据库

什么没有改变

  • ✅ MCP协议:相同的9个工具,具有相同的界面
  • ✅ API兼容性:替代TypeScript版本
  • ✅ 图形语义学:相同的实体/关系/观察模型
  • ✅ 工具名称:完全相同(create_entities, search_nodes等等)

迁移说明

Rust版本以SQLite格式存储数据,因此您不能直接从TypeScript JSONL文件迁移。如果您需要迁移:

  1. 使用以下命令从TypeScript版本导出图形 read_graph
  2. 使用导入到Rust版本 create_entities + create_relations

何时使用哪个版本

在以下情况下使用TypeScript版本:

  • 你需要快速原型制作
  • 文件大小<1000个实体
  • 简单的基于文本的存储就足够了
  • 不需要并发访问

在以下情况下使用Rust版本:

  • 您需要生产级性能
  • 文件大小>1000个实体
  • 需要ACID事务
  • 需要并发读取权限
  • 想要编译时类型安全

许可证

麻省理工学院