内存存储服务

基于Rust实现的MCP内存服务,提供内存存储、检索、标签搜索和删除功能,支持多种存储后端和嵌入模型。

  • by rbownes
  • Rust
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 rbownes/mcp-memory-server

使用说明

MCP内存服务(Rust实现)

这是模型上下文协议(MCP)内存服务的Rust实现,使用官方 Rust MCP SDK.

特性

  • 实现提供内存存储和检索功能的MCP服务器
  • 通过stdio进行通信,便于与MCP客户端集成
  • 提供以下工具:
    • store_memory:存储包含内容、标签和元数据的新内存
    • retrieve_memory:检索语义上类似于查询的记忆
    • search_by_tag:按标签搜索记忆
    • delete_memory:按哈希值删除内存
  • 支持多个存储后端:
    • 内存存储(用于测试和开发)
    • ChromaDB存储(用于生产)
  • 支持多种嵌入模型:
    • 虚拟嵌入生成器(用于测试和开发)
    • ONNX嵌入模型(使用ONNX Runtime的基于变压器的嵌入)

先决条件

  • 铁锈和货物(1.75.0或更高版本)
  • Node.js和npm(用于使用MCP检查器进行测试)
  • 可选:ChromaDB服务器(用于生产)

建筑

cargo build

对于发布版本:

cargo build --release

跑步

要直接运行服务器,请执行以下操作:

cargo run

使用环境变量进行配置:

MCP_MEMORY_STORAGE_BACKEND=chromadb \
MCP_MEMORY_CHROMA_PATH=/path/to/chroma \
MCP_MEMORY_EMBEDDING_MODEL=onnx \
cargo run

配置

可以使用环境变量配置服务器:

变量 描述 默认值
MCP_MEMORY_STORAGE_BACKEND 存储后端(inmemory 或 chromadb) inmemory
MCP_MEMORY_CHROMA_PATH ChromaDB数据目录路径 平台特定数据目录
MCP_MEMORY_CHROMA_URL ChromaDB服务器的URL(可选) 无
MCP_MEMORY_CHROMA_COLLECTION ChromaDB集合名称 memory_collection
MCP_MEMORY_EMBEDDING_MODEL 嵌入模型(dummy 或 onnx) dummy
MCP_MEMORY_EMBEDDING_MODEL_PATH ONNX模型文件的路径(可选) 无
MCP_MEMORY_EMBEDDING_SIZE 嵌入向量大小 384
MCP_MEMORY_LOG_LEVEL 日志级别 info

测试

这个项目包括一个简单的Node.js测试脚本,用于测试服务器。要运行测试,请执行以下操作:

npm test

项目结构

  • src/main.rs:主服务器实现
  • src/config.rs:配置处理
  • src/models.rs:数据模型
  • src/storage/:存储实施
    • mod.rs:存储特性和内存实现
    • chroma.rs:ChromaDB存储实施
  • src/embeddings.rs:嵌入模型实现
  • src/utils.rs:实用功能
  • Cargo.toml:Rust项目配置
  • package.json:用于测试工具的Node.js项目配置
  • test-mcp-server.js:一个简单的Node.js脚本,用于以编程方式测试服务器

实现细节

服务器是使用 rmcp Rust MCP SDK中的crate。它使用:

  • 这 #[tool(tool_box)] 属性宏定义工具
  • 这 ServerHandler MCP协议实现的特点
  • 这 stdio() CLI使用的传输
  • 异步Rust与Tokio用于并发操作
  • 结构化日志记录的跟踪

示例用法

使用启动服务器后 cargo run,您可以将JSON-RPC请求发送到其stdin。例如:

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocol_version":"2024-11-05","capabilities":{"tools":true},"client_info":{"name":"test-client","version":"0.1.0"}}}
{"jsonrpc":"2.0","id":2,"method":"list_tools","params":{}}
{"jsonrpc":"2.0","id":3,"method":"call_tool","params":{"name":"store_memory","arguments":{"content":"This is a test memory","tags":["test","example"]}}}

ONNX嵌入实现

ONNX嵌入模型实现使用ONNX运行时运行基于转换器的模型来生成嵌入。其工作原理如下:

  1. 模型加载:The OnnxEmbeddingGenerator 从指定路径加载ONNX格式的预训练变压器模型和标记器。

  2. 分词:使用HuggingFace对输入文本进行标记 tokenizers 库,它将文本转换为令牌ID、注意力掩码和令牌类型ID。

  3. 推断:标记化的输入被传递给ONNX模型,该模型产生变压器的隐藏状态。

  4. 平均池化:使用均值池(由注意力掩码加权)处理最后一个隐藏状态,以创建固定大小的嵌入向量。

  5. 归一化:生成的嵌入是L2归一化的,以确保向量幅度的一致性。

要使用ONNX嵌入模型,请执行以下操作:

  1. 使用HuggingFace等工具将变压器模型(如BERT、RoBERTa等)导出为ONNX格式 transformers.onnx.
  2. 将标记器另存为 tokenizer.json 文件与模型位于同一目录中,或指定单独的路径。
  3. 设置环境变量:
    MCP_MEMORY_EMBEDDING_MODEL=onnx
    MCP_MEMORY_EMBEDDING_MODEL_PATH=/path/to/model.onnx
    MCP_MEMORY_EMBEDDING_SIZE=768  # Adjust based on your model's output size
    

向MCP客户端注册

要向MCP客户端(如Claude)注册此服务器,您需要将其添加到客户端的MCP配置中。下面是一个JSON配置示例:

{
  "mcpServers": {
    "memory-service": {
      "command": "/path/to/mcp-rust-server",
      "args": [],
      "env": {
        "MCP_MEMORY_STORAGE_BACKEND": "inmemory",
        "MCP_MEMORY_EMBEDDING_MODEL": "onnx",
        "MCP_MEMORY_EMBEDDING_MODEL_PATH": "/path/to/model.onnx",
        "MCP_MEMORY_EMBEDDING_SIZE": "768",
        "MCP_MEMORY_LOG_LEVEL": "info"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

对于Claude Desktop,此配置将添加到:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • 窗户: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

对于Claude VSCode扩展,配置将添加到:

  • ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json

未来改进

  • 添加对更多变压器架构的支持
  • 添加更多存储后端
  • 添加更多嵌入模型
  • 添加更多内存管理工具
  • 添加身份验证和授权
  • 添加对更多传输的支持(HTTP、WebSocket等)

建筑

graph TD
    subgraph "External Interactions"
        direction LR
        Client([MCP Client]) -. JSON-RPC .-> StdioTransport[Stdio Transport]
        EnvVars[(Environment Variables)] -.-> Config
        ChromaDBServer[(ChromaDB Server)] <-. HTTP API .-> ChromaStorage
        OnnxModel[("ONNX Model File (.onnx)")] <-. Loads .-> OnnxEmbed
        TokenizerFile[("Tokenizer File (tokenizer.json)")] <-. Loads .-> OnnxEmbed
    end

    subgraph "MCP Memory Service (Rust Application)"
        direction TB
        StdioTransport -- Forwards Requests --> ServerCore{MCP Server Core} 

        ServerCore -- Reads --> Config(Configuration) 
        ServerCore -- Instantiates --> EmbeddingImpl{{Selected Embedding Generator}}
        ServerCore -- Instantiates --> StorageImpl{{Selected Storage Backend}}
        ServerCore -- Uses Tool Impls --> ToolLogic(Tool Logic: store, retrieve, search, delete)

        ToolLogic -- Uses --> StorageImpl
        ToolLogic -- Uses --> EmbeddingImpl
        ToolLogic -- Uses --> Models(Data Models) 
        ToolLogic -- Uses --> Utils(Utilities) 

        %% FIX: Added IDs EL and SL to subgraphs below
        subgraph EL [Embedding Layer]
            direction TB
            EmbeddingImpl -- Is an instance of --> EmbeddingTrait(EmbeddingGenerator Trait)
            DummyEmbed(DummyEmbeddingGenerator) -- Implements --> EmbeddingTrait
            OnnxEmbed(OnnxEmbeddingGenerator) -- Implements --> EmbeddingTrait
            OnnxEmbed -- Uses Lib --> OrtLib[ort crate]
            OnnxEmbed -- Uses Lib --> TokenizersLib[tokenizers crate]
        end

        subgraph SL [Storage Layer]
            direction TB
            StorageImpl -- Is an instance of --> StorageTrait(MemoryStorage Trait)
            InMemoryStorage(InMemoryStorage) -- Implements --> StorageTrait
            ChromaStorage(ChromaMemoryStorage) -- Implements --> StorageTrait
            StorageImpl -- Uses --> EmbeddingImpl
            StorageImpl -- Uses --> Models
            ChromaStorage -- Uses Lib --> ReqwestLib[reqwest crate]
        end

    end

    %% Styling
    classDef external fill:#f9f,stroke:#333,stroke-width:1px;
    classDef rust_app fill:#e6ffed,stroke:#333,stroke-width:1px;
    classDef trait fill:#lightblue,stroke:#333,stroke-width:1px;
    classDef impl fill:#lightgrey,stroke:#333,stroke-width:1px;
    classDef module fill:#whitesmoke,stroke:#333,stroke-width:1px;
    classDef lib fill:#cornsilk,stroke:#333,stroke-width:1px;


    class Client,EnvVars,ChromaDBServer,OnnxModel,TokenizerFile external;
    class StdioTransport,ServerCore,ToolLogic,Config,Models,Utils rust_app;
    class EmbeddingTrait,StorageTrait trait;
    class EmbeddingImpl,StorageImpl,DummyEmbed,OnnxEmbed,InMemoryStorage,ChromaStorage impl;
    class OrtLib,TokenizersLib,ReqwestLib lib;
    %% FIX: Used subgraph IDs EL and SL below
    class EL,SL module

许可证

此项目根据MIT许可证获得许可-有关详细信息,请参阅许可证文件。