持久分层内存MCP服务器

一个生产就绪的模型上下文协议(MCP)服务器,为AI代理提供持久化分层内存,支持语义相似性搜索、自动生命周期管理和多级存储(工作内存、短期内存、长期内存)。

  • by Parswanadh
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 Parswanadh/memory-mcp-server

使用说明

持久分层内存MCP服务器

一种生产就绪的模型上下文协议(MCP)服务器,为AI代理提供持久的分层内存。具有语义相似性搜索、自动生命周期管理和多层存储(工作、短期、长期记忆)功能。

特性

  • 分层存储层

    • 工作内存(分钟)-当前上下文,内存缓存
    • 短期记忆(天/周)-最近的交互,带TTL的向量存储
    • 长期记忆(月)-整合知识,永久存储
  • 语义搜索

    • 基于嵌入的向量相似性搜索
    • 按层、标签、重要性过滤
    • 任务的上下文感知回忆
  • 自动生命周期管理

    • 基于时间衰减的重要性评分
    • 层间自动升级/降级
    • 巩固旧记忆
    • 基于TTL和相关性的遗忘
  • 多后端支持

    • 内存(开发/测试)
    • Weaviate(自托管)
    • 松果(管理)
  • 多个嵌入提供程序

    • OpenAI(文本嵌入3-small)
    • 基于本地TF-IDF(无外部API)

安装

npm install @anthropic-ai/memory-mcp-server

或者从源代码构建:

git clone https://github.com/anthropics/memory-mcp-server.git
cd memory-mcp-server
npm install
npm run build

配置

环境变量

创建一个 .env 文件(参见 .env.example):

# Vector Store Selection (memory, weaviate, pinecone)
VECTOR_STORE_TYPE=memory

# Weaviate Configuration
WEAVIATE_URL=http://localhost:8080
WEAVIATE_API_KEY=optional

# Pinecone Configuration
PINECONE_API_KEY=your-api-key
PINECONE_INDEX=memory-mcp

# Embedding Configuration
EMBEDDING_PROVIDER=openai
OPENAI_API_KEY=your-api-key
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
OPENAI_EMBEDDING_DIMENSIONS=1536

# Memory Layer TTL (milliseconds)
WORKING_MEMORY_TTL=1800000          # 30 minutes
SHORT_TERM_MEMORY_TTL=604800000     # 7 days
LONG_TERM_MEMORY_TTL=31536000000    # 1 year

# Consolidation
CONSOLIDATION_THRESHOLD=100         # Memories before consolidation
CONSOLIDATION_AGE=2592000000        # 30 days

# Importance Decay
DECAY_RATE=0.1                      # Exponential decay rate
DECAY_INTERVAL=86400000             # Daily decay

Claude桌面配置

添加到您的Claude Desktop配置文件中:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json 视窗: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "memory": {
      "command": "node",
      "args": ["path/to/memory-mcp-server/build/index.js"],
      "env": {
        "VECTOR_STORE_TYPE": "memory",
        "EMBEDDING_PROVIDER": "openai",
        "OPENAI_API_KEY": "your-api-key-here"
      }
    }
  }
}

工具

记忆库

将信息与元数据一起存储在持久内存中。

参数:

  • content (string,必填):要存储的内容
  • importance (数字,0-1,默认值:0.5):重要性得分
  • tags (字符串数组,默认值:[]):类别标记
  • source (字符串:“user”|“agent”|“system”,默认值:“agent”):源
  • layer (字符串:“工作”|“短期”|“长期”):显式层

例子:

await memory_store({
  content: "User prefers concise responses with code examples",
  importance: 0.9,
  tags: ["preferences", "communication-style"]
})

记忆搜索

使用语义相似性搜索记忆。

参数:

  • query (字符串,必填):搜索查询
  • limit (数字,默认值:10):最大结果
  • layerFilter (字符串数组):按层过滤
  • minRelevance (数字,0-1,默认值:0):最小相似性阈值
  • tags (字符串数组):按标签筛选

例子:

await memory_search({
  query: "user preferences for code formatting",
  limit: 5,
  minRelevance: 0.5
})

memory_recall

检索特定任务的上下文相关记忆。

参数:

  • task (字符串,必填):任务描述
  • context (字符串,可选):附加上下文
  • limit (数字,默认值:10):最大内存

例子:

await memory_recall({
  task: "Help debug a React component",
  context: "User is working on a dashboard project",
  limit: 10
})

记忆_巩固

总结并压缩旧记忆。

参数:

  • olderThan (数字,可选):时间戳过滤器
  • targetSize (数字,默认值:50):目标计数
  • layer (字符串,默认值:“短期”):要合并的层

例子:

await memory_consolidate({
  targetSize: 50,
  layer: "short-term"
})

记忆_遗忘

明确地或根据标准删除记忆。

参数:

  • memoryId (字符串,可选):特定内存ID
  • olderThan (数字,可选):时间戳过滤器
  • layer (字符串,可选):要清除的图层
  • reason (字符串,可选):审核原因

例子:

await memory_forget({
  olderThan: Date.now() - 30 * 24 * 60 * 60 * 1000, // 30 days ago
  layer: "working",
  reason: "Cleanup expired working memories"
})

memory_list

使用筛选列出所有存储的内存。

参数:

  • layer (字符串,可选):按层过滤
  • tags (字符串数组,可选):按标签筛选
  • limit (数字,默认值:100):最大结果

memory_stats

获取有关存储内存的统计信息。

退货:

  • totalMemories:总计数
  • byLayer:每层计数
  • avgImportance:平均重要性
  • oldestMemory:最旧的时间戳
  • newestMemory:最新时间戳

建筑

┌─────────────────────────────────────────────────────────────┐
│                   Memory MCP Server                         │
├─────────────────────────────────────────────────────────────┤
│  Memory Layers:                                             │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │ Working      │  │ Short-Term   │  │ Long-Term    │      │
│  │ (30 min TTL) │  │ (7 day TTL)  │  │ (1 year TTL) │      │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
│         │                 │                  │              │
│         └─────────────────┴──────────────────┘              │
│                           │                                 │
│                   ┌───────▼────────┐                        │
│                   │ Vector Store   │                        │
│                   │ (Memory/       │                        │
│                   │  Weaviate/     │                        │
│                   │  Pinecone)     │                        │
│                   └────────────────┘                        │
│                                                           │
│  Lifecycle:                                               │
│  - Semantic search (cosine similarity)                    │
│  - Temporal decay (forgetting curve)                      │
│  - Importance scoring (attention mechanism)               │
│  - Consolidation (summarization)                          │
│  - Automatic promotion/demotion                           │
└─────────────────────────────────────────────────────────────┘

发展

# Install dependencies
npm install

# Build TypeScript
npm run build

# Watch mode for development
npm run watch

# Run tests
npm test

# Run tests with coverage
npm run test:coverage

# Lint code
npm run lint

# Format code
npm run format

内存生命周期

  1. 存储

    • 根据重要性为新记忆分配一个层
    • 为语义搜索生成嵌入
    • 元数据包括时间戳、重要性、来源、标签
  2. 访问

    • 每次访问都会更新访问计数和上次访问时间
    • 频繁访问的内存被提升到更高的层次
  3. 衰变

    • 重要性分数随时间衰减(指数衰减)
    • 低重要性,旧记忆被降级或删除
  4. 整合

    • 旧记忆按主题分组
    • 组被总结成单个记忆
    • 原始记忆被删除
  5. 遗忘

    • 基于TTL的过期
    • 显式删除
    • 按层或时间戳进行批量清理

矢量存储后端

内存中(默认)

最适合:

  • 开发和测试
  • 小规模部署
  • 无基础设施设置

限制:

  • 重启后不持久
  • 受可用RAM限制

Weaviate

最适合:

  • 自托管部署
  • 完全控制数据
  • 混合搜索功能

设置:

docker run -p 8080:8080 weaviate/weaviate:latest

松果

最适合:

  • 生产部署
  • 管理服务
  • 自动缩放

设置:

# Create index via Pinecone console
# Configure PINECONE_API_KEY and PINECONE_INDEX

嵌入提供者

OpenAI(推荐)

  • text-embedding-3-small:1536个维度,快速,经济高效
  • 需要API密钥
  • 最佳语义质量

本地(仅限开发)

  • 基于TF-IDF的嵌入
  • 不需要外部API
  • 语义质量较低
  • 512个维度

最佳实践

  1. 使用适当的重要性评分

    • 1.0:关键信息(用户偏好、API密钥)
    • 0.7-0.9:重要背景(项目细节、目标)
    • 0.4-0.6:一般信息(对话、观察)
    • 0.1-0.3:瞬态信息(临时注释)
  2. 标记你的记忆

    • 使用描述性标签便于检索
    • 包括类别、项目或用户标识符
    • 合并后标记“合并”
  3. 定期合并

    • 活动系统每周运行一次
    • 根据存储需求调整targetSize
    • 检查合并记忆的质量
  4. 监控内存运行状况

    • 使用 memory_stats 检查分布情况
    • 注意任何层的内存膨胀
    • 根据需要调整TTL值

故障排除

问题:“矢量存储未初始化”

解决方案: 检查您的环境变量和矢量存储配置。

问题:“OpenAI API错误”

解决方案: 验证您的OPENAI_API_KEY是否有效并具有API信用。

问题:“未找到相关记忆”

解决方案:

  • 检查是否存在记忆 memory_list
  • 试着降低 minRelevance 阈值
  • 使用更广泛的搜索查询

问题:“内存层已满”

解决方案:

  • 跑 memory_consolidate 压缩旧记忆
  • 在配置中调整TTL值
  • 使用 memory_forget 清理

许可证

麻省理工学院

贡献

欢迎投稿!请阅读我们的贡献指南,并将pull请求提交到主存储库。

支持

  • GitHub问题:https://github.com/anthropics/memory-mcp-server/issues
  • MCP文件:https://github.com/modelcontextprotocol