mcpField
M
Memory MCP Server

Memory MCP Server

本地服务
github.com/evangstav记忆与知识1630 周前更新

关于 Memory MCP Server

Memory MCP Server 将实体、关系和观察记录存储为经过验证的知识图谱,适用于需要结构化记忆的 MCP 客户端,并支持自然语言搜索、时间查询和模糊匹配。

主要功能

  1. 01存储实体、关系和观察记录
  2. 02验证图数据及关系规则
  3. 03通过自然语言搜索
  4. 04支持时间查询和模糊匹配
  5. 05获取实体及完整图谱
  6. 06删除图数据并刷新记忆

适用场景

  1. 01保存项目实体及其关联
  2. 02按活动或时间查询观察记录
  3. 03获取图谱以检查关联信息

MCP 相关

该 MCP 服务提供用于创建、获取、搜索和删除知识图谱数据以及刷新记忆的工具。MCP 客户端可通过这些工具管理实体、关系和观察记录。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"python-memory": {
"command": "uvx",
"args": [
"memory-mcp-server"
]
}
}
}
启动命令uvx memory-mcp-server

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypimemory-mcp-server

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

MseeP.ai Security Assessment Badge

记忆 MCP 服务

一种模型上下文协议(MCP)服务,提供知识图谱功能,用于在内存中管理实体、关系和观察记录,并通过严格的验证规则来维护数据一致性。

安装

在 Claude Desktop 中安装服务:

mcp install main.py -v MEMORY_FILE_PATH=/path/to/memory.jsonl

数据验证规则

实体名称
  • 必须以小写字母开头
  • 可以包含小写字母、数字和连字符
  • 长度最多为 100 个字符
  • 在图谱中必须唯一
  • 有效名称示例:python-project、meeting-notes-2024、user-john
实体类型

支持以下实体类型:

  • person:人类实体
  • concept:抽象想法或原则
  • project:工作计划或任务
  • document:任何形式的文档
  • tool:软件工具或实用程序
  • organization:公司或团体
  • location:实体或虚拟地点
  • event:有时间限制的事件
观察记录
  • 非空字符串
  • 长度最多为 500 个字符
  • 每个实体内必须唯一
  • 应为客观、基于事实的陈述
  • 相关时应包含时间戳
关系

支持以下关系类型:

  • knows:人与人之间的联系
  • contains:父子关系
  • uses:实体使用另一个实体
  • created:作者/创建关系
  • belongs-to:成员/所有权关系
  • depends-on:依赖关系
  • related-to:通用关系

其他关系规则:

  • 源实体和目标实体都必须存在
  • 不允许自引用关系
  • 不允许循环依赖
  • 必须使用预定义的关系类型

用法

该服务提供用于管理知识图谱的工具:

获取实体
result = await session.call_tool("get_entity", {
    "entity_name": "example"
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    elif result.error_type == "VALIDATION_ERROR":
        print(f"Invalid input: {result.error}")
    else:
        print(f"Error: {result.error}")
else:
    entity = result.data
    print(f"Found entity: {entity}")
获取图谱
result = await session.call_tool("get_graph", {})
if result.success:
    graph = result.data
    print(f"Graph data: {graph}")
else:
    print(f"Error retrieving graph: {result.error}")
创建实体
# Valid entity creation
entities = [
    Entity(
        name="python-project",  # Lowercase with hyphens
        entityType="project",   # Must be a valid type
        observations=["Started development on 2024-01-29"]
    ),
    Entity(
        name="john-doe",
        entityType="person",
        observations=["Software engineer", "Joined team in 2024"]
    )
]
result = await session.call_tool("create_entities", {
    "entities": entities
})
if not result.success:
    if result.error_type == "VALIDATION_ERROR":
        print(f"Invalid entity data: {result.error}")
    else:
        print(f"Error creating entities: {result.error}")
添加观察记录
# Valid observation
result = await session.call_tool("add_observation", {
    "entity": "python-project",
    "observation": "Completed initial prototype"  # Must be unique for entity
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    elif result.error_type == "VALIDATION_ERROR":
        print(f"Invalid observation: {result.error}")
    else:
        print(f"Error adding observation: {result.error}")
创建关系
# Valid relation
result = await session.call_tool("create_relation", {
    "from_entity": "john-doe",
    "to_entity": "python-project",
    "relation_type": "created"  # Must be a valid type
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    elif result.error_type == "VALIDATION_ERROR":
        print(f"Invalid relation data: {result.error}")
    else:
        print(f"Error creating relation: {result.error}")
搜索记忆
result = await session.call_tool("search_memory", {
    "query": "most recent workout"  # Supports natural language queries
})
if result.success:
    if result.error_type == "NO_RESULTS":
        print(f"No results found: {result.error}")
    else:
        results = result.data
        print(f"Search results: {results}")
else:
    print(f"Error searching memory: {result.error}")

搜索功能支持:

  • 时间查询(例如,“最近”、“上次”、“最新”)
  • 活动查询(例如,“锻炼”、“运动”)
  • 常规实体搜索
  • 模糊匹配,相似度阈值为 80%
  • 加权搜索:
    • 实体名称(权重:1.0)
    • 实体类型(权重:0.8)
    • 观察记录(权重:0.6)
删除实体
result = await session.call_tool("delete_entities", {
    "names": ["python-project", "john-doe"]
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    else:
        print(f"Error deleting entities: {result.error}")
删除关系
result = await session.call_tool("delete_relation", {
    "from_entity": "john-doe",
    "to_entity": "python-project"
})
if not result.success:
    if result.error_type == "NOT_FOUND":
        print(f"Entity not found: {result.error}")
    else:
        print(f"Error deleting relation: {result.error}")
清空记忆
result = await session.call_tool("flush_memory", {})
if not result.success:
    print(f"Error flushing memory: {result.error}")

错误类型

该服务使用以下错误类型:

  • NOT_FOUND:未找到实体或资源
  • VALIDATION_ERROR:输入数据无效
  • INTERNAL_ERROR:服务端错误
  • ALREADY_EXISTS:资源已存在
  • INVALID_RELATION:实体之间的关系无效

响应模型

所有工具都使用以下模型返回类型化响应:

EntityResponse
class EntityResponse(BaseModel):
    success: bool
    data: Optional[Dict[str, Any]] = None
    error: Optional[str] = None
    error_type: Optional[str] = None
GraphResponse
class GraphResponse(BaseModel):
    success: bool
    data: Optional[Dict[str, Any]] = None
    error: Optional[str] = None
    error_type: Optional[str] = None
OperationResponse
class OperationResponse(BaseModel):
    success: bool
    error: Optional[str] = None
    error_type: Optional[str] = None

开发

运行测试
pytest tests/
添加新功能
  1. 在 validation.py 中更新验证规则
  2. 在 tests/test_validation.py 中添加测试
  3. 在 knowledge_graph_manager.py 中实现更改

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。