内存MCP服务器(Rust+SQLite)
MCP内存服务器的高性能Rust实现——持久克劳德内存的知识图。
原始项目
特性
- 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 Database file path (default: system data dir or MEMORY_FILE_PATH env)
-s, --stream Enable streamable HTTP mode (default: stdio)
-p, --port
HTTP port for stream mode [default: 8000]
-b, --bind Bind address for stream mode [default: 127.0.0.1]
-l, --log [] Enable file logging [default: memory-mcp-rs.log]
-h, --help Print help
-V, --version Print versionstdio模式示例
# 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.logHTTP流模式示例
# 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/mcpMCP工具
| 工具 | 说明 |
|---|---|
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 implementationSQLite架构
-- 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 / Result |
| 错误处理 | 例外情况 | Result + 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文件迁移。如果您需要迁移:
- 使用以下命令从TypeScript版本导出图形
read_graph - 使用导入到Rust版本
create_entities+create_relations
何时使用哪个版本
在以下情况下使用TypeScript版本:
- 你需要快速原型制作
- 文件大小\1000个实体
- 需要ACID事务
- 需要并发读取权限
- 想要编译时类型安全
许可证
麻省理工学院
