返回市场
内存服务器

内存服务器

作者:rbownes3 星标更新:2025-04-03

项目介绍

MCP内存服务(Rust实现)

这是使用官方Rust MCP SDK实现的Model Context Protocol (MCP) 内存服务。

特性

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

预备条件

  • Rust和Cargo(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存储后端(inmemorychromadbinmemory
MCP_MEMORY_CHROMA_PATHChromaDB数据目录路径平台特定的数据目录
MCP_MEMORY_CHROMA_URLChromaDB服务器URL(可选)
MCP_MEMORY_CHROMA_COLLECTIONChromaDB集合名称memory_collection
MCP_MEMORY_EMBEDDING_MODEL嵌入模型(dummyonnxdummy
MCP_MEMORY_EMBEDDING_MODEL_PATHONNX模型文件路径(可选)
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脚本,用于程序化地测试服务器

实现细节

服务器使用来自Rust MCP SDK的rmcp库实现。它使用:

  • #[tool(tool_box)]属性宏定义工具
  • ServerHandler特性实现MCP协议
  • stdio()传输用于命令行使用
  • 使用Tokio进行异步操作
  • 使用Tracing进行结构化日志记录

示例用法

启动服务器后,可以向其标准输入发送JSON-RPC请求。例如:

{"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":"这是一条测试记忆","tags":["测试","示例"]}}}

ONNX嵌入实现

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

  1. 模型加载OnnxEmbeddingGenerator从指定路径加载预训练的转换器模型(ONNX格式)和分词器。
  2. 分词:使用HuggingFace的tokenizers库对输入文本进行分词,将其转换为令牌ID、注意力掩码和令牌类型ID。
  3. 推理:将分词后的输入传递给ONNX模型,产生转换器的隐藏状态。
  4. 均值池化:使用注意力掩码加权的最后隐藏状态进行均值池化,创建固定大小的嵌入向量。
  5. 归一化:对结果嵌入进行L2归一化,确保向量幅度一致。

要使用ONNX嵌入模型:

  1. 使用如HuggingFace的transformers.onnx等工具将转换器模型(如BERT、RoBERTa等)导出为ONNX格式。
  2. 将分词器保存为与模型同目录的tokenizer.json文件,或指定单独的路径。
  3. 设置环境变量:
    MCP_MEMORY_EMBEDDING_MODEL=onnx
    MCP_MEMORY_EMBEDDING_MODEL_PATH=/path/to/model.onnx
    MCP_MEMORY_EMBEDDING_SIZE=768  # 根据您的模型输出大小调整
    

注册到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
  • Windows: %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 "外部交互"
        direction LR
        客户端([MCP客户端]) -. JSON-RPC .-> StdioTransport[标准输入输出传输]
        环境变量[(环境变量)] -.-> 配置
        ChromaDB服务器[(ChromaDB服务器)] <-. HTTP API .-> Chroma存储
        ONNX模型文件[("ONNX模型文件(.onnx)")] <-. 加载 .-> ONNX嵌入
        分词器文件[("分词器文件(tokenizer.json)")] <-. 加载 .-> ONNX嵌入
    end

    subgraph "MCP内存服务(Rust应用)"
        direction TB
        StdioTransport -- 转发请求 --> 服务器核心{MCP服务器核心}

        服务器核心 -- 读取 --> 配置(配置)
        服务器核心 -- 实例化 --> 嵌入实现{{选定的嵌入生成器}}
        服务器核心 -- 实例化 --> 存储实现{{选定的存储后端}}
        服务器核心 -- 使用工具实现 --> 工具逻辑(工具逻辑:存储、检索、搜索、删除)

        工具逻辑 -- 使用 --> 存储实现
        工具逻辑 -- 使用 --> 嵌入实现
        工具逻辑 -- 使用 --> 模型(数据模型)
        工具逻辑 -- 使用 --> 工具(工具)

        %% FIX: 在下面的子图中添加了IDs EL和SL
        subgraph EL [嵌入层]
            direction TB
            嵌入实现 -- 是实例 --> 嵌入特性(嵌入生成器特性)
            虚拟嵌入(VirtualEmbeddingGenerator) -- 实现 --> 嵌入特性
            ONNX嵌入(ONNXEmbeddingGenerator) -- 实现 --> 嵌入特性
            ONNX嵌入 -- 使用库 --> Ort库[ort库]
            ONNX嵌入 -- 使用库 --> Tokenizers库[tokenizers库]
        end

        subgraph SL [存储层]
            direction TB
            存储实现 -- 是实例 --> 存储特性(内存存储特性)
            内存存储(内存存储) -- 实现 --> 存储特性
            Chroma存储(Chroma内存存储) -- 实现 --> 存储特性
            存储实现 -- 使用 --> 嵌入实现
            存储实现 -- 使用 --> 模型
            Chroma存储 -- 使用库 --> Reqwest库[reqwest库]
        end

    end

    %% 样式
    classDef 外部 fill:#f9f,stroke:#333,stroke-width:1px;
    classDef rust_app fill:#e6ffed,stroke:#333,stroke-width:1px;
    classDef 特性 fill:#lightblue,stroke:#333,stroke-width:1px;
    classDef 实现 fill:#lightgrey,stroke:#333,stroke-width:1px;
    classDef 模块 fill:#whitesmoke,stroke:#333,stroke-width:1px;
    classDef 库 fill:#cornsilk,stroke:#333,stroke-width:1px;

    class 客户端,环境变量,ChromaDB服务器,ONNX模型文件,分词器文件 外部;
    class StdioTransport,服务器核心,工具逻辑,配置,模型,工具 rust_app;
    class 嵌入特性,存储特性 特性;
    class 嵌入实现,存储实现,虚拟嵌入,ONNX嵌入,内存存储,Chroma存储 实现;
    class Ort库,Tokenizers库,Reqwest库 库;
    %% FIX: 下面使用了子图IDs EL和SL
    class EL,SL 模块

许可证

本项目根据MIT许可证发布 - 查看LICENSE文件获取详细信息。